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.