pemilih tombol android

115

Ini adalah tombol pemilih sedemikian rupa sehingga ketika normal tampak merah, ketika ditekan tampak abu-abu.

Saya ingin bertanya bagaimana kode dapat dimodifikasi lebih lanjut sehingga ketika PRESSED ukuran teks dan warna juga bisa berubah? Terimakasih banyak!

<item android:state_pressed="true" >         
    <shape xmlns:android="http://schemas.android.com/apk/res/android"> 
        <stroke android:width="2dp" android:color="@color/black" />
        <solid android:color="@color/grey"/>
        <padding android:left="5dp" android:top="2dp" 
            android:right="5dp" android:bottom="2dp" /> 
        <corners android:radius="5dp" /> 
    </shape>    
</item>

<item>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"> 
        <stroke android:width="2dp" android:color="@color/black" />
        <solid android:color="#FF6699"/>
        <padding android:left="5dp" android:top="2dp" 
            android:right="5dp" android:bottom="2dp" /> 
        <corners android:radius="5dp" /> 
    </shape>
</item>

pearmak
sumber

Jawaban:

217

Anda hanya perlu set selectordari buttondalam file tata letak Anda.

<Button
     android:id="@+id/button1"
     android:background="@drawable/selector_xml_name"
     android:layout_width="200dp"
     android:layout_height="126dp"
     android:text="Hello" />

dan selesai.

Sunting

Berikut adalah button_effect.xmlfile dalam drawabledirektori

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/numpad_button_bg_selected" android:state_selected="true"></item>
    <item android:drawable="@drawable/numpad_button_bg_pressed" android:state_pressed="true"></item>
    <item android:drawable="@drawable/numpad_button_bg_normal"></item>

</selector>

Di sini, Anda dapat melihat bahwa ada 3 drawable, Anda hanya perlu menempatkan button_effectgaya ini ke Anda button, seperti yang saya tulis di atas. Anda hanya perlu mengganti selector_xml_namedengan button_effect.

Chintan Rathod
sumber
bisakah Anda menjelaskan lebih lanjut tentang cara mengatur keadaan tekan dan non-tekan? (dengan semua komponen diatas seperti warna bulat, guratan, dll). Terimakasih banyak!
pearmak
Cara terbaik untuk mengimplementasikan pemilih adalah dengan menggunakan xml, lihat blazin.in/2016/03/how-to-use-selectors-for-botton.html saya diimplementasikan sesuai ini dan kerjanya
Bhushan Shirsath
Hai, saya tahu sudah lama Anda menulis postingan ini, tetapi mungkin Anda akan tahu apa yang saya lewatkan. Saya menggunakan kode Anda dan tombol saya selalu hijau lalu untuk ditekan = benar dan dipilih = benar itu mengubah drawable menjadi abu-abu tetapi tombol secod sebelum aktivitas lain dibuka memiliki gaya android default. Tahu keadaan apa yang saya lewatkan?
volfk
27

Anda tidak dapat mencapai perubahan ukuran teks dengan drawable daftar status . Untuk mengubah warna teks dan ukuran teks lakukan ini:

Warna teks

Untuk mengubah warna teks, Anda dapat membuat sumber daya daftar status warna . Ini akan menjadi sumber daya terpisah yang terletak di res/color/direktori. Dalam layout xml Anda harus mengaturnya sebagai nilai untuk android:textColoratribut. Pemilih warna kemudian akan berisi sesuatu seperti ini:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="@color/text_pressed" />
    <item android:color="@color/text_normal" />
</selector>

Ukuran teks

Anda tidak dapat mengubah ukuran teks hanya dengan resource. Tidak ada "pemilih dimen". Anda harus melakukannya dalam kode. Dan tidak ada solusi langsung.

Mungkin solusi termudah mungkin memanfaatkan View.onTouchListener()dan menangani kejadian naik dan turun yang sesuai. Gunakan sesuatu seperti ini:

view.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // change text size to the "pressed value"
                return true;
            case MotionEvent.ACTION_UP:
                // change text size to the "normal value"
                return true;
            default:
                return false;
            }
        }
});

Solusi yang berbeda mungkin untuk memperluas tampilan dan mengganti setPressed(Boolean)metode. Metode ini dipanggil secara internal saat terjadi perubahan status yang ditekan. Kemudian ubah ukuran teks sesuai dengan pemanggilan metode (jangan lupa untuk memanggil super).

Tomik
sumber
14

Buat custom_selector.xml di folder drawable

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:drawable="@drawable/unselected" android:state_pressed="true" />
   <item android:drawable="@drawable/selected" />
</selector>

Buat bentuk selected.xml di folder drawable

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" android:padding="90dp">
   <solid android:color="@color/selected"/>
   <padding />
   <stroke android:color="#000" android:width="1dp"/>
   <corners android:bottomRightRadius="15dp" android:bottomLeftRadius="15dp" android:topLeftRadius="15dp" android:topRightRadius="15dp"/>
</shape>

Buat bentuk unselected.xml di folder drawable

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" android:padding="90dp">
   <solid android:color="@color/unselected"/>
   <padding />
   <stroke android:color="#000" android:width="1dp"/>
   <corners android:bottomRightRadius="15dp" android:bottomLeftRadius="15dp" android:topLeftRadius="15dp" android:topRightRadius="15dp"/>
</shape>

Tambahkan warna berikut untuk status yang dipilih / tidak dipilih di folder color.xml nilai

<color name="selected">#a8cf45</color>
<color name="unselected">#ff8cae3b</color>

Anda dapat memeriksa solusi lengkap dari sini

nirav kalola
sumber
2

Cara terbaik untuk mengimplementasikan selector adalah dengan menggunakan xml daripada menggunakan cara programatik karena lebih mudah untuk diimplementasikan dengan xml.

    <?xml version="1.0" encoding="utf-8"?>    
<selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@drawable/button_bg_selected" android:state_selected="true"></item>
        <item android:drawable="@drawable/button_bg_pressed" android:state_pressed="true"></item>
        <item android:drawable="@drawable/button_bg_normal"></item>

    </selector>

Untuk informasi lebih lanjut saya menerapkan menggunakan tautan ini http://www.blazin.in/2016/03/how-to-use-selectors-for-botton.html

Bhushan Shirsath
sumber
2

Dalam file Layout .xml

<Button
 android:id="@+id/button1"
 android:background="@drawable/btn_selector"
 android:layout_width="100dp"
 android:layout_height="50dp"
 android:text="press" />

btn_selector.xml

<?xml version="1.0" encoding="utf-8"?>

 <item android:drawable="@drawable/btn_bg_selected" android:state_selected="true"></item>
<item android:drawable="@drawable/btn_bg_pressed" android:state_pressed="true"></item>
<item android:drawable="@drawable/btn_bg_normal"></item>

Vishal G. Gohel
sumber
1

Anda dapat menggunakan kode ini:

<Button
android:id="@+id/img_sublist_carat"
android:layout_width="70dp"
android:layout_height="68dp"
android:layout_centerVertical="true"
android:layout_marginLeft="625dp"
android:contentDescription=""
android:background="@drawable/img_sublist_carat_selector"
android:visibility="visible" />

(File Pemilih) img_sublist_carat_selector.xml:

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:state_focused="true" 
       android:state_pressed="true"        
       android:drawable="@drawable/img_sublist_carat_highlight" />
 <item android:state_pressed="true" 
       android:drawable="@drawable/img_sublist_carat_highlight" />
 <item android:drawable="@drawable/img_sublist_carat_normal" />
</selector>
Bhaskar Kumar Singh
sumber