2011-11-16 19 views
13

इसलिए मैं अपना मेनू आइटम प्राप्त करने का प्रयास कर रहा हूं, जो एक चेक करने योग्य मेनू विकल्प की तरह व्यवहार करने के लिए एक्शन बार पर दिखाया गया है। एफआईआर भाग काम करता है, जिसका अर्थ यह चेक करने योग्य है और जब मैं इसे दबाता हूं, और कोड में सेट सेट चेक (सत्य) यह काम करता है। लेकिन दृश्य भाग क्या काम नहीं करता है। चेक किए गए और अनचेक किए गए राज्यों में एक्शन बार पर मेनू आइटम कैसा दिखता है, इसमें कोई बदलाव नहीं है? मैंने अवैधateOptionsMenu() का उपयोग करने का प्रयास किया लेकिन यह नौकरी नहीं करता है, न केवल वह, मेरे कोड में उस पंक्ति के साथ मैं चेक किए गए राज्य से बाहर नहीं निकल सकता?! क्या होता है कि चेकमेन स्थिति को अनसेट करने के लिए विकल्पमेनू() सीम को अमान्य कर दें और मैं 'लूपिंग' समाप्त करता हूं, या उस मेनू आइटम के प्रत्येक प्रेस पर मैं उस कोड के अनचेक भाग पर जाता रहता हूं जहां इसे चेक किया जाता है और इसे अमान्य करने के साथएंड्रॉइड एक्शन बार चेक करने योग्य मेनू आइटम ठीक से काम नहीं करता/दिखाता है?

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id="@+id/lenslist_menu_add" 
     android:showAsAction="always" 
     android:title="@string/add"/> 
    <item android:id="@+id/lenslist_menu_delete" 
     android:showAsAction="always" 
     android:checkable="true" 
     android:title="@string/delete"/> 
</menu> 

यहाँ और जावा कोड है: अनियंत्रित मुझे लगता है कि ...

यहाँ मेनू के लिए अपने XML फ़ाइल से कोड है

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // TODO Auto-generated method stub 
    switch (item.getItemId()) { 
    case R.id.lenslist_menu_add: 

     return true; 
    case R.id.lenslist_menu_delete: 
     if (item.isChecked() == true) { 
      item.setChecked(false); 
      deleteMode = false; 
      lensAdapter.setDeleteMode(false); 
     } else { 
      item.setChecked(true); 
      deleteMode = true; 
      lensAdapter.setDeleteMode(true); 
     } 
     lensAdapter.notifyDataSetChanged(); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

धन्यवाद!

उत्तर

30

चेक करने योग्य आइटम केवल उपमेनस या संदर्भ मेनू में दिखाई देते हैं।

आप उन्हें मुख्य मेनू आइटम के रूप में उपयोग कर रहे हैं, इसलिए यह काम नहीं करेगा।

स्रोत: डाउनलोड एपीआई डेमो, और फ़ाइल ApiDemos/res/मेनू/checkable.xml खोलते हैं, तो आप लाइन 13. पर एक टिप्पणी के रूप में यह देखेंगे कि मैं नहीं जानता कि क्यों वे उल्लेख नहीं है टिप्पणी .: के साथ इस डेवलपर दस्तावेज़ में

संदर्भ http://alvinalexander.com/java/jwarehouse/android-examples/platforms/android-2/samples/ApiDemos/res/menu/checkable.xml.shtml

+0

कहाँ से कि बोली है? –

+0

आप एपी डेमोस में एक टिप्पणी के रूप में पा सकते हैं: ApiDemos \ res \ menu \ checkable.xml, मैं डेवलपर दस्तावेज़ – Entreco

4

सबसे अच्छा समाधान एक CheckBox को <Item> की actionLayout स्थापित करने के लिए है। यह समाधान आपको एक देशी दिखने वाला चेकबॉक्स (भौतिक एनिमेशन आदि के साथ) देता है, जिसमें एक फ़ॉन्ट जो अन्य वस्तुओं से मेल खाता है, और यह एक क्रिया के रूप में और सबमेनू में काम करता है।

  1. action_checkbox.html नामक एक नए लेआउट बनाएँ:
<?xml version="1.0" encoding="utf-8"?> 
<CheckBox xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:paddingStart="8dp" 
      android:paddingEnd="8dp" 
      android:checked="false" 
      android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Menu" 
      android:id="@+id/action_item_checkbox" 
    /> 
  1. अपने सेट <Item> इस तरह। ध्यान दें कि आप Checkable और Checked अभी भी मामले में यह एक उप मेनू में दिखाया गया है की जरूरत है (इस स्थिति में actionLayout नजरअंदाज कर दिया है।
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> 
    <item android:id="@+id/menu_action_logging" 
      android:title="@string/action_logging" 
      android:orderInCategory="100" 
      android:showAsAction="always" 
      android:checkable="true" 
      android:checked="false" 
      android:actionLayout="@layout/action_checkbox" 
     /> 
</menu> 
  1. में अपने कोड, जब मेनू बनाया जाता है तो हमें एक की आवश्यकता होती है) मेनू आइटम शीर्षक से मेल खाने के लिए चेकबॉक्स का शीर्षक सेट करें, बी) दोनों मेनू चेक-इन की चेक की गई स्थिति को पुनर्स्थापित करें, और हमारे अतिरिक्त चेकबॉक्स, और सी) एक ऑनक्लिक() जोड़ें हमारे अतिरिक्त चेकबॉक्स के लिए श्रोता। इस कोड में मैं RetainedFragment में चेकबॉक्स की स्थिति को कायम रख रहा हूं।
// Set the check state of an actionbar item that has its actionLayout set to a layout 
    // containing a checkbox with the ID action_item_checkbox. 
    private void setActionBarCheckboxChecked(MenuItem it, boolean checked) 
    { 
     if (it == null) 
      return; 

     it.setChecked(checked); 

     // Since it is shown as an action, and not in the sub-menu we have to manually set the icon too. 
     CheckBox cb = (CheckBox)it.getActionView().findViewById(R.id.action_item_checkbox); 
     if (cb != null) 
      cb.setChecked(checked); 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) 
    { 
     inflater.inflate(R.menu.menu_main, menu); 
     super.onCreateOptionsMenu(menu, inflater); 

     // Restore the check state e.g. if the device has been rotated. 
     final MenuItem logItem = menu.findItem(R.id.menu_action_logging); 
     setActionBarCheckboxChecked(logItem, mRetainedFragment.getLoggingEnabled()); 

     CheckBox cb = (CheckBox)logItem.getActionView().findViewById(R.id.action_item_checkbox); 
     if (cb != null) 
     { 
      // Set the text to match the item. 
      cb.setText(logItem.getTitle()); 
      // Add the onClickListener because the CheckBox doesn't automatically trigger onOptionsItemSelected. 
      cb.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        onOptionsItemSelected(logItem); 
       } 
      }); 
     } 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.menu_action_logging: 
       // Toggle the checkbox. 
       setActionBarCheckboxChecked(item, !item.isChecked()); 

       // Do whatever you want to do when the checkbox is changed. 
       mRetainedFragment.setLoggingEnabled(item.isChecked()); 
       return true; 
      default: 
       break; 
     } 

     return false; 
    } 
+0

में इसे खोजने में सक्षम नहीं था mRetainedFragment क्या है? –

+0

यही वही है जो मैं अपना कोड करना चाहता था। चेकबॉक्स को टॉगल करते समय अपने कोड को जो भी करना चाहते हैं उसे बदलें। – Timmmm

+0

धन्यवाद। मैंने एक्शन बार में कस्टम लेआउट जोड़कर तय किया है। कार्य सही –

5

या बस कर अपने आप को

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    menu.findItem(R.id.item1).setIcon(menu_checked?R.drawable.menu_ico_checked:R.drawable.menu_ico_unchecked); 
    return super.onPrepareOptionsMenu(menu); 
} 

और onOptionsItemSelected में कार्य करें:

.... 
menu_checked=!menu_checked; 
invalidateOptionsMenu(); 
+0

यदि मैं कर सकता हूं तो मैं आपको हजारों बार वोट दूंगा – Rasel

संबंधित मुद्दे