Android: XML का उपयोग करके टॉगलबटन के लिए दो अलग-अलग छवियां निर्दिष्ट करें


100

मैं डिफ़ॉल्ट ToggleButtonउपस्थिति को ओवरराइड करने का प्रयास कर रहा हूं । यहां 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"/>

अब, हमारे पास दो 30 x 30 आइकन हैं जिन्हें हम क्लिक किए गए / गैर-क्लिक किए गए राज्यों के लिए उपयोग करना चाहते हैं। अभी हमारे पास कोड है जो प्रोग्राम को स्टेटस के आधार पर बैकग्राउंड आइकन को बदल देता है:

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

जाहिर है मैं ऐसा करने के लिए बेहतर तरीके की तलाश में हूं। मैंने पृष्ठभूमि छवि के लिए एक चयनकर्ता बनाने की कोशिश की है, जो स्वचालित रूप से राज्यों के बीच स्विच करेगा:

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

लेकिन यह काम नहीं करता है; ToggleButtonएपीआई पढ़ना ( http://developer.android.com/reference/android/widget/ToggleButton.html ), यह प्रतीत होता है कि केवल विरासत में मिली xml विशेषताएँ हैं

    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. 

, State_checked विशेषता वर्ग विधि होने के बावजूद: वहाँ एंड्रॉयड होना प्रतीत नहीं होता है isChecked()और setChecked()

तो, क्या एक्सएमएल में जो मैं चाहता हूं उसे करने का एक तरीका है, या क्या मैं अपने गंदे वर्कअराउंड के साथ फंस गया हूं?


ध्यान दें, यदि आप पाठ का उपयोग नहीं कर रहे हैं, तो मुझे लगता है कि इसका उपयोग करना बेहतर हो सकता है CompoundButton
टिम्म्म

1
अवहेलना है कि; CompoundButtonअमूर्त है!
टिम्मम नोव

जवाबों:


159

आपका कोड ठीक है। हालाँकि, टॉगल बटन आपके चयनकर्ता के पहले आइटम को प्रदर्शित करेगा कि यह मेल खाता है, इसलिए डिफ़ॉल्ट अंतिम आना चाहिए। निम्नलिखित तरीके से वस्तुओं को व्यवस्थित करें यह सुनिश्चित करने के लिए कि उनका उपयोग किया जाएगा:

<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
यह सही समझ में आता है; मैंने कभी चयनकर्ता और स्विच स्टेटमेंट के बीच संबंध नहीं बनाया।
I82Much

आपने मेरा दिन बना दिया ... मेरे पास बटन, चेकबॉक्स के साथ मुद्दे थे और फिर रेडियो बटन की कोशिश की, आखिरकार यह पोस्ट मददगार थी। बहुत बहुत धन्यवाद विटाली पोलोनेटस्की और I82Much
डेविड प्रून

8
प्रलेखन कहीं कहता है कि यह ऊपर से पढ़ता है, पहले राज्य में रोक रहा है जिसकी शर्तें सभी को मिलती हैं, इसलिए यदि डिफ़ॉल्ट शीर्ष पर है, तो यह कभी भी उस आकर्षित करने योग्य अतीत को प्राप्त नहीं करेगा।
ट्रैविस

1
@ I82Much switchहमेशा आदेश की परवाह किए बिना "सही एक" का चयन करेगा, यह if-elseif-elseif-elseशर्तों की तरह लंबे समय के साथ अधिक व्यवहार करता है state_x == true && state_y == false && state_z = true
ट्वीस्टरेब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.