[Android] MenuItem की जांच की गई स्थिति उसके आइकन द्वारा ठीक से नहीं दिखायी गई है


Answers

यदि आप अभी भी एक्सएमएल ड्रॉएबल में परिभाषित व्यवहार (चेक, चेक नहीं किया गया) चाहते हैं, तो यह एक तरीका है जिसे आप पूरा कर सकते हैं:

if (item.getItemId()==R.id.menu_item){
    item.setChecked(!item.isChecked());
    StateListDrawable stateListDrawable = (StateListDrawable) getResources().getDrawable(R.drawable.selector_drawable);
    int[] state = {item.isChecked()?android.R.attr.state_checked:android.R.attr.state_empty};
    stateListDrawable.setState(state);
    item.setIcon(stateListDrawable.getCurrent());
}
Question

मेरे पास मेनू इटेटम को इस तरह परिभाषित किया गया है:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_starred"
        android:icon="@drawable/btn_star"
        android:title="@string/description_star"
        android:checkable="true"
        android:checked="true"
        android:orderInCategory="1"
        android:showAsAction="always" />
</menu>

और btn_star.xml इस तरह परिभाषित:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item 
        android:state_checked="false" 
        android:drawable="@drawable/btn_star_off_normal" />
    <item 
        android:state_checked="true"
        android:drawable="@drawable/btn_star_on_normal" />
</selector>

जब मैं इसे का उपयोग करके एक विकल्प मेनू बना देता हूं, हालांकि, आइकन को इसकी जांच की गई स्थिति में कभी नहीं दिखाया जाता है, भले ही MenuItem isChecked() गुण सत्य है।

मैं ActionBarSherlock नियंत्रण का उपयोग कर रहा हूं, हालांकि, मैं एक ही परिणाम प्राप्त कर रहा हूं अगर मैं केवल एक सामान्य विकल्प मेनू setChecked(true) करें setChecked(true) कॉल करता setChecked(true) यह अभी भी आइटम की जांच की गई स्थिति की परवाह किए बिना btn_star_off को btn_star_off प्रदर्शित करता है।

onOptionsItemSelected() विधि को सही ढंग से बुलाया जा रहा है, और मैं सफलतापूर्वक चेक किए गए गुण को बदल सकता हूं:

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if(item.isCheckable()) {
            item.setChecked(!item.isChecked());
        }
        return super.onOptionsItemSelected(item);
}

यहां एक ब्रेकपॉइंट सेट करना हैइसकीज वाली संपत्ति को बदला जा रहा है, लेकिन सही स्थिति को दर्शाने के लिए आइकन स्वयं अपडेट नहीं किया गया है

क्या मुझे कुछ याद आ रही है? क्या मैं यह गलत तरीके से कर रहा हूं? मैं समझ नहीं सकता कि यह सही तरीके से काम क्यों नहीं करेगा।