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?


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>

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.