Android: Tentukan dua gambar berbeda untuk tombol sakelar menggunakan XML

100

Aku mencoba untuk menimpa default ToggleButtonpenampilan. Inilah XML yang mendefinisikan ToggleButton:

<ToggleButton android:id="@+id/FollowAndCenterButton"
        android:layout_width="30px"
        android:layout_height="30px"
        android:textOn="" android:textOff="" android:layout_alignParentLeft="true"
        android:layout_marginLeft="5px"
        android:layout_marginTop="5px" android:background="@drawable/locate_me"/>

Sekarang, kami memiliki dua ikon 30 x 30 yang ingin kami gunakan untuk status diklik / tidak diklik. Saat ini kami memiliki kode yang secara terprogram mengubah ikon latar belakang tergantung pada status:

centeredOnLocation.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            if (centeredOnLocation.isChecked()) {
                centeredOnLocation.setBackgroundDrawable(getResources().getDrawable(R.drawable.locate_me_on));
            } else {
                centeredOnLocation.setBackgroundDrawable(getResources().getDrawable(R.drawable.locate_me));
            }
        }
});

Jelas saya sedang mencari cara yang lebih baik untuk melakukan ini. Saya telah mencoba membuat pemilih untuk gambar latar belakang, yang secara otomatis akan beralih di antara status:

 <selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:drawable="@drawable/locate_me" /> <!-- default -->
 <item android:state_checked="true"
       android:drawable="@drawable/locate_me_on" /> <!-- pressed -->
 <item android:state_checked="false"
       android:drawable="@drawable/locate_me" /> <!-- unchecked -->

Tapi ini tidak berhasil; membaca ToggleButtonAPI ( http://developer.android.com/reference/android/widget/ToggleButton.html ), tampaknya satu-satunya atribut xml yang diwariskan adalah

    XML Attributes
Attribute Name  Related Method  Description
android:disabledAlpha       The alpha to apply to the indicator when disabled. 
android:textOff         The text for the button when it is not checked. 
android:textOn      The text for the button when it is checked. 

Sepertinya tidak ada atribut android: state_checked, meskipun kelas tersebut memiliki metode isChecked()dansetChecked() .

Jadi, apakah ada cara untuk melakukan apa yang saya inginkan dalam XML, atau apakah saya terjebak dengan solusi yang berantakan?

I82Banyak
sumber
Perhatikan, jika Anda tidak menggunakan teks, saya pikir mungkin lebih baik untuk digunakan CompoundButton.
Timmmm
1
Abaikan itu; CompoundButtonabstrak!
Timmmm

Jawaban:

159

Kode Anda baik-baik saja. Namun, tombol sakelar akan menampilkan item pertama di selektor Anda yang cocok, jadi defaultnya harus yang terakhir. Atur barang-barang dengan cara berikut untuk memastikan semuanya akan digunakan:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:state_pressed="true" /> //currently pressed turning the toggle on
    <item android:state_pressed="true" /> //currently pressed turning the toggle off
    <item android:state_checked="true" /> //not pressed default checked state
    <item /> //default non-pressed non-checked
</selector>
m_vitaly
sumber
3
Itu sangat masuk akal; Saya tidak pernah membuat hubungan antara selector dan pernyataan switch.
I82Much
Anda membuat hari saya ... Saya memiliki masalah dengan tombol, kotak centang dan kemudian mencoba tombol radio juga, akhirnya posting ini bermanfaat. Terima kasih banyak Vitaly Polonetsky dan I82Much
David Prun
8
dokumentasi di suatu tempat mengatakan bahwa ia membaca dari atas, berhenti di status pertama yang semua kondisinya terpenuhi, jadi jika default ada di atas, ia tidak akan pernah bisa melewati drawable itu.
Travis
1
@ I82Much a switchakan selalu memilih "yang benar" terlepas dari urutannya, ini berperilaku lebih seperti waktu yang lama if-elseif-elseif-elsedengan kondisi seperti state_x == true && state_y == false && state_z = true.
TWiStErRob