Android: XML kullanarak togglebutton için iki farklı resim belirtin


100

Varsayılan ToggleButtongörünümü geçersiz kılmaya çalışıyorum . İşte tanımlayan XML 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"/>

Şimdi, tıklanan / tıklanmayan durumlar için kullanmak istediğimiz iki adet 30 x 30 simgemiz var. Şu anda duruma bağlı olarak arka plan simgesini programlı olarak değiştiren bir kodumuz var:

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));
            }
        }
});

Açıkçası bunu yapmanın daha iyi bir yolunu arıyorum. Arka plan görüntüsü için, durumlar arasında otomatik olarak geçiş yapacak bir seçici yapmaya çalıştım:

 <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 -->

Ancak bu çalışmıyor; ToggleButtonAPI ( http://developer.android.com/reference/android/widget/ToggleButton.html ) okunduğunda, devralınan xml özelliklerinin yalnızca

    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. 

Yöntem sahip sınıfın rağmen state_checked özellik: android Orada görünmüyor isChecked()ve setChecked().

Öyleyse, XML'de istediğimi yapmanın bir yolu var mı, yoksa karmaşık geçici çözümüme takılıp kaldım mı?


Not, metin kullanmıyorsanız, kullanmanın daha iyi olabileceğini düşünüyorum CompoundButton.
Timmmm

1
Bunu dikkate almayın; CompoundButtonsoyuttur!
Timmmm

Yanıtlar:


159

Kodunuz iyi. Ancak, geçiş düğmesi seçicinizde eşleştiği ilk öğeyi görüntüleyecektir, bu nedenle varsayılan son olmalıdır. Tümünün kullanılmasını sağlamak için öğeleri aşağıdaki şekilde düzenleyin:

<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
Bu çok mantıklı; Selector ve switch ifadeleri arasında hiçbir zaman bağlantı kurmadım.
I82Much

Günümü siz yaptınız ... Düğme, onay kutusu ile ilgili sorunlar yaşadım ve ardından radyo düğmesini de denedim, sonunda bu yazı yardımcı oldu. Çok teşekkür ederim Vitaly Polonetsky ve I82Much
David Prun

8
bir yerde belgeler, yukarıdan okuduğunu, tüm koşulları karşılayan ilk durumda durduğunu söylüyor, bu nedenle varsayılan en üstte ise, o çekilebilirliği asla geçemeyecek.
Travis

1
@ I82Much a switch, sıraya bakılmaksızın her zaman "doğru olanı" seçer, bu gibi if-elseif-elseif-elsekoşullar ile daha uzun gibi davranır state_x == true && state_y == false && state_z = true.
TWiStErRob
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.