एक चयनित राज्य के साथ Android ImageButton?


87

अगर मैं अपनी पृष्ठभूमि के लिए एक चयनकर्ता के साथ एक ImageButton का उपयोग कर रहा था, तो क्या ऐसी स्थिति है जो मैं बदल सकता हूं जो इसे अपनी उपस्थिति बदल देगा? अभी मैं इसे दबाए जाने पर छवियों को बदलने के लिए प्राप्त कर सकता हूं, लेकिन ऐसा प्रतीत होता है कि कोई "हाइलाइटेड" या "चयनित" या इसी तरह की स्थिति नहीं है जो मुझे इच्छा पर अपनी उपस्थिति को टॉगल करने की अनुमति देता है।

यहाँ मेरा XML है; यह केवल उपस्थिति बदल जाता है जब दबाया जाता है।

 <selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:state_pressed="false" android:drawable="@drawable/map_toolbar_details_selected" />
<item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/map_toolbar_details_selected" />
<item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/map_toolbar_details_selected" />
<item android:drawable="@drawable/map_toolbar_details" />


1
एक ImageButton का उपयोग करना, और चयनित राज्य को ट्रैक करना थोड़ा हैक लगता है। यदि आप टॉगल कार्यक्षमता चाहते हैं, तो आपको टॉगल बटन का उपयोग करना चाहिए।
एंड्रास बालाज़ लाजथा

जवाबों:


214

यह मेरे लिए काम करता है:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- NOTE: order is important (the first matching state(s) is what is rendered) -->
    <item 
        android:state_selected="true" 
        android:drawable="@drawable/info_icon_solid_with_shadow" />
    <item 
        android:drawable="@drawable/info_icon_outline_with_shadow" />
 </selector>

और फिर जावा में:

//assign the image in code (or you can do this in your layout xml with the src attribute)
imageButton.setImageDrawable(getBaseContext().getResources().getDrawable(R.drawable....));

//set the click listener
imageButton.setOnClickListener(new OnClickListener() {

    public void onClick(View button) {
        //Set the button's appearance
        button.setSelected(!button.isSelected());

        if (button.isSelected()) {
            //Handle selected state change
        } else {
            //Handle de-select state change
        }

    }

});

निर्बाध संक्रमण के लिए आप एनीमेशन समय का भी उल्लेख कर सकते हैं:

<selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_mediumAnimTime">

3
यह मेरे लिए काम करता है, लेकिन मैं यह जोड़ना चाहूंगा, कि इस xml को आपके ड्रॉ करने योग्य फ़ोल्डर में बनाना चाहिए और यदि आप चाहते हैं कि ImageButton जब इसे दबाए, तो इसे हाइलाइट करें, आपको android_ state_pressed के बजाय State_selected का उपयोग करना चाहिए। इसके अलावा, यह राज्य बिना किसी आइटम के ऊपर होना चाहिए, क्योंकि यह सामान्य से कम है।
डेनिस कुतलुबाएव

3
NOTE: order is important (the first matching state(s) is what is renderedयह काम किया, लेकिन मुझे अजीब क्यों नहीं मिला?
मुहम्मद बाबर

2
किसी भी राज्य विशेषताओं की अनुपस्थिति में, आइटम किसी भी राज्य से मेल खाएगा। इसलिए चयनकर्ता के दूसरे आइटम को "कैच ऑल" स्थिति के रूप में सोचें।
joshrl

2
आदेश महत्वपूर्ण नहीं है आपको केवल यह सुनिश्चित करने की आवश्यकता है कि आप android:state_selected="false" डिफ़ॉल्ट के साथ प्रदान करते हैं !
मुहम्मद बाबर

मैं एक विजेट में एक ही कैसे कर सकता हूं? मेरे पास एक बटन है, लेकिन मुझे यह पता नहीं लग सकता है कि यह कैसे करना है।
Si8

19

ToggleImageButtonजो Checkableइंटरफ़ेस और समर्थन OnCheckedChangeListenerऔर android:checkedxml विशेषता को लागू करता है :

public class ToggleImageButton extends ImageButton implements Checkable {
    private OnCheckedChangeListener onCheckedChangeListener;

    public ToggleImageButton(Context context) {
        super(context);
    }

    public ToggleImageButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        setChecked(attrs);
    }

    public ToggleImageButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setChecked(attrs);
    }

    private void setChecked(AttributeSet attrs) {
        TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ToggleImageButton);
        setChecked(a.getBoolean(R.styleable.ToggleImageButton_android_checked, false));
        a.recycle();
    }

    @Override
    public boolean isChecked() {
        return isSelected();
    }

    @Override
    public void setChecked(boolean checked) {
        setSelected(checked);

        if (onCheckedChangeListener != null) {
            onCheckedChangeListener.onCheckedChanged(this, checked);
        }
    }

    @Override
    public void toggle() {
        setChecked(!isChecked());
    }

    @Override
    public boolean performClick() {
        toggle();
        return super.performClick();
    }

    public OnCheckedChangeListener getOnCheckedChangeListener() {
        return onCheckedChangeListener;
    }

    public void setOnCheckedChangeListener(OnCheckedChangeListener onCheckedChangeListener) {
        this.onCheckedChangeListener = onCheckedChangeListener;
    }

    public static interface OnCheckedChangeListener {
        public void onCheckedChanged(ToggleImageButton buttonView, boolean isChecked);
    }
}

res / values ​​/ attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="ToggleImageButton">
        <attr name="android:checked" />
    </declare-styleable>
</resources>

2
मुझे इसे कैसे प्रयोग में लाना है? मैंने निर्देश का पालन किया: developer.android.com/training/custom-views/create-view.html लेकिन मैं इसे काम नहीं कर सका।
एटिसमैन

2
धन्यवाद! ध्यान दें कि एक चयनकर्ता इसके साथ state_checkedकाम नहीं करता है, हालांकि, आपको इसका उपयोग करना होगा state_selected
फ्लोरियन वॉन स्टॉश

11

और अधिक छवियों के बिना ऐसा करने का सबसे अच्छा तरीका:

public static void buttonEffect(View button){
    button.setOnTouchListener(new OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    v.getBackground().setColorFilter(0xe0f47521,PorterDuff.Mode.SRC_ATOP);
                    v.invalidate();
                    break;
                }
                case MotionEvent.ACTION_UP: {
                    v.getBackground().clearColorFilter();
                    v.invalidate();
                    break;
                }
            }
            return false;
        }
    });
}

1
आप अपने xml से रंग पाने के लिए getResource ()। getColor (R.color.lightblue) का उपयोग कर सकते हैं।
बेटो कालदास

@ एंड्रस को बटन को थोड़ा और दबाए रखने की जरूरत है। क्या आप जानते हैं कि ऐसा क्यों है?
सिंहलमेसी

3

एक res/drawableफ़ोल्डर में एक XML-फ़ाइल बनाएँ। उदाहरण के लिए, "btn_image.xml":

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/bg_state_1"
          android:state_pressed="true"
          android:state_selected="true"/>
    <item android:drawable="@drawable/bg_state_2"
          android:state_pressed="true"
          android:state_selected="false"/>
    <item android:drawable="@drawable/bg_state_selected"
          android:state_selected="true"/>
    <item android:drawable="@drawable/bg_state_deselected"/>
</selector>

आप उन फ़ाइलों को जोड़ सकते हैं जिन्हें आप पसंद करते हैं, उदाहरण के लिए, "bg_state_1" को "bg_state_deselected" और "bg_state_2" को "bg_state_selected" में बदलें।

उन फ़ाइलों में से कुछ में आप कुछ इस तरह लिख सकते हैं:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <solid android:color="#ccdd00"/>
    <corners android:radius="5dp"/>
</shape>

निम्नलिखित विशेषताओं वाले लेआउट फ़ाइल में ImageView या ImageButton बनाएँ:

<ImageView
    android:id="@+id/image"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:adjustViewBounds="true"
    android:background="@drawable/btn_image"
    android:padding="10dp"
    android:scaleType="fitCenter"
    android:src="@drawable/star"/>

बाद में कोड में:

image.setSelected(!image.isSelected());

2

इसे इस्तेमाल करे:

 <item
   android:state_focused="true"
   android:state_enabled="true"
   android:drawable="@drawable/map_toolbar_details_selected" />

इसके अलावा रंगों के साथ मुझे सफलता मिली

<selector
        xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:state_selected="true"

            android:color="@color/primary_color" />
        <item
            android:color="@color/secondary_color" />
</selector>

हम्म। मदद करने के लिए प्रतीत नहीं होता है। मैं एक CompoundButton का उपयोग कर रहा हूं। क्या ऑन-ऑफ के लिए उस प्रकार के बटन के लिए एक राज्य विशिष्ट है?
जोरेन

हाँ, यह कहा जाता है को चेक किया देखें isChecked () developer.android.com/reference/android/widget/...
Bostwickenator

0
if (iv_new_pwd.isSelected()) {
                iv_new_pwd.setSelected(false);
                Log.d("mytag", "in case 1");
                edt_new_pwd.setInputType(InputType.TYPE_CLASS_TEXT);
            } else {
                Log.d("mytag", "in case 1");
                iv_new_pwd.setSelected(true);
                edt_new_pwd.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
            }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.