android मैं एक्शनबार में मेनू आइटम कैसे छिपा सकता हूं?




9 Answers

इस प्रश्न में एक परिशिष्ट मिला:

यदि आप अपने मेनू आइटम्स की दृश्यता को बदलना चाहते हैं तो आपको बस अपनी गतिविधि में एक सदस्य चर सेट करने की आवश्यकता है ताकि आप याद कर सकें कि आप मेनू को छिपाना चाहते हैं और invalidateOptionsMenu() कॉल करना चाहते हैं और आइटम को अपने ओवरराइड onCreateOptionsMenu(...) विधि onCreateOptionsMenu(...)

//anywhere in your code
...
mState = HIDE_MENU; // setting state
invalidateOptionsMenu(); // now onCreateOptionsMenu(...) is called again
...

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    // inflate menu from xml
    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.settings, menu);

    if (mState == HIDE_MENU)
    {
        for (int i = 0; i < menu.size(); i++)
            menu.getItem(i).setVisible(false);
    }
}

मेरे उदाहरण में मैंने सभी वस्तुओं को छुपाया है।

android android-actionbar menuitem android-menu

मेरे पास मेन्यूइटम के साथ एक एक्शन बार है। मैं उस मेनू आइटम को कैसे छुपा / दिखा सकता हूं?

यही वह है जो मैं करने की कोशिश कर रहा हूं:

MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();



आप इसे कॉल कर सकते हैं:

MenuItem item = menu.findItem(R.id.my_item);
item.setVisible(false);

अद्यतन करें:

सुनिश्चित करें कि आपका कोड item लिए null नहीं लौटाता है या यह एप्लिकेशन को क्रैश कर सकता है।




मैं थोड़ा और संदर्भ के साथ एक जवाब की तलाश में था। अब जब मैंने इसे समझ लिया है, तो मैं वह जवाब जोड़ूंगा।

मेनू xml में डिफ़ॉल्ट रूप से बटन छुपाएं

डिफ़ॉल्ट रूप से शेयर बटन छुपाया जाएगा, जैसा कि android:visible="false" द्वारा सेट किया गया है android:visible="false"

main_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">

    <!-- hide share button by default -->
    <item
        android:id="@+id/menu_action_share"
        android:icon="@drawable/ic_share_white_24dp"
        android:visible="false"     
        android:title="Share"
        app:showAsAction="always"/>

    <item
        android:id="@+id/menu_action_settings"
        android:icon="@drawable/ic_settings_white_24dp"
        android:title="Setting"
        app:showAsAction="ifRoom"/>

</menu>

कोड में बटन दिखाएं

लेकिन शेयर बटन वैकल्पिक रूप से कुछ शर्त के आधार पर दिखाया जा सकता है।

MainActivity.java

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);
    MenuItem shareItem = menu.findItem(R.id.menu_action_share);

    // show the button when some condition is true
    if (someCondition) {        
        shareItem.setVisible(true);
    }

    return true;
}

यह भी देखें




P1r4nh4 उत्तर ठीक काम करता है, मैंने बस एक बुलियन ध्वज का उपयोग करके इसे सरल बना दिया:

public int mState = 0; //at the top of the code
//where you want to trigger the hide action
mState = 1; // to hide or mState = 0; to show
invalidateOptionsMenu(); // now onCreateOptionsMenu(...) is called again
...

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    // inflate menu from xml
    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.settings, menu);

    if (mState == 1) //1 is true, 0 is false
    {
        //hide only option 2
            menu.getItem(2).setVisible(false);
    }
}



एक वैरिएबल को एक मान सेट करें और अमान्य ऑप्शनमेनू () को कॉल करें;

उदाहरण के लिए

    selectedid=arg2;
            invalidateOptionsMenu();


 public boolean onPrepareOptionsMenu(Menu menu) {

    if(selectedid==1){
        menu.findItem(R.id.action_setting).setVisible(false);
        menu.findItem(R.id.action_s2).setVisible(false);
        menu.findItem(R.id.action_s3).setVisible(false);
    }
    else{
        if(selectedid==2){
            menu.findItem(R.id.action_search).setVisible(false);
            menu.findItem(R.id.action_s4).setVisible(false);
            menu.findItem(R.id.action_s5).setVisible(false);
        }
    }
    return super.onPrepareOptionsMenu(menu);
}



एंड्रॉइड डेवलपर आधिकारिक साइट के अनुसार, OnCreateOptionMenu (मेनू मेनू) को मेनू आइटम या आइकन बदलने के लिए अनुशंसित नहीं किया जाता है, दृश्यता..एटीसी रनटाइम पर।

सिस्टम क्रिएटऑप्शनमेनू () पर कॉल करने के बाद, यह आपके द्वारा पॉप्युलेट किए गए मेनू का एक उदाहरण बनाए रखता है और किसी कारण से मेनू को अमान्य होने तक फिर से क्रिएटऑप्शनमेनू () पर कॉल नहीं करेगा। हालांकि, आपको केवल प्रारंभिक मेनू स्थिति बनाने और गतिविधि जीवन चक्र के दौरान परिवर्तन न करने के लिए क्रिएटऑप्शनमेनू () पर उपयोग करना चाहिए।

यदि आप गतिविधि जीवन चक्र के दौरान होने वाली घटनाओं के आधार पर विकल्प मेनू को संशोधित करना चाहते हैं, तो आप onPrepareOptionsMenu () विधि में ऐसा कर सकते हैं। यह विधि आपको मेनू ऑब्जेक्ट पास करती है क्योंकि यह वर्तमान में मौजूद है ताकि आप इसे संशोधित कर सकें, जैसे आइटम जोड़ना, निकालना या अक्षम करना। (टुकड़े भी एक onPrepareOptionsMenu () कॉलबैक प्रदान करते हैं।) - एंड्रॉइड डेवलपर आधिकारिक साइट -

जैसा कि आप अनुशंसित हैं, आप इस विकल्प का उपयोग कर सकते हैं ITemSelected (MenuItem आइटम) विधि उपयोगकर्ता इनपुट ट्रैक करें।

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();

    if (id == R.id.edit) {
        Intent intent = new Intent(this, ExampleActivity.class);
        intent.putExtra(BUNDLE_KEY, mConnection);
        startActivityForResult(intent, PICK_CHANGE_REQUEST);
        return true;
    } else if (id == R.id.delete) {
        showDialog(this);
        return true;
    }

    return super.onOptionsItemSelected(item);
}

यदि आपको रन टाइम पर मेनू आइटम बदलने की आवश्यकता है, तो आप उन्हें बदलने के लिए PrepareOptionsMenu (मेनू मेनू) पर उपयोग कर सकते हैं

@Override
public boolean onPrepareOptionsMenu(Menu menu){

    if (Utils.checkNetworkStatus(ExampleActivity.this)) {
        menu.findItem(R.id.edit).setVisible(true);
        menu.findItem(R.id.delete).setVisible(true);
    }else {
        menu.findItem(R.id.edit).setVisible(false);
        menu.findItem(R.id.delete).setVisible(false);
    }
    return true;
} 



यदि आपने उपरोक्त उत्तरों में सबकुछ किया है, लेकिन मेनू आइटम अभी भी दिखाई देता है, तो जांचें कि आप अद्वितीय संसाधन का संदर्भ देते हैं। उदाहरण के लिए, क्रिएटऑप्शनमेनू या ऑनपेयरऑप्शनमेनू में

@Override
public void onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    MenuItem menuOpen = menu.findItem(R.id.menu_open);
    menuOpen.setVisible(false);
}

Ctrl + R.id.menu_open पर क्लिक करें और जांचें कि यह केवल एक मेनू फ़ाइल में मौजूद है। यदि इस संसाधन का पहले से कहीं भी उपयोग किया जाता है और किसी गतिविधि में लोड किया जाता है, तो वह वहां छिपाने की कोशिश करेगा।




Appcompat लाइब्रेरी का उपयोग करने वालों के लिए: यदि आपकी गतिविधि एक्शनबैरएक्टिविटी उप-वर्ग है, तो आप supportInvalidateOptionsMenu () को कॉल कर सकते हैं

यहां देखा गया: https://.com/a/19649877/1562524




मेनू में सभी आइटम को केवल एक कमांड से छिपाने का सबसे अच्छा तरीका है अपने मेनू xml पर "समूह" का उपयोग करना। बस सभी मेनू आइटम जोड़ें जो एक ही समूह के अंदर आपके ओवरफ़्लो मेनू में होंगे।

इस उदाहरण में हमारे पास दो मेनू आइटम हैं जो हमेशा दिखाए जाएंगे (नियमित आइटम और खोज) और तीन ओवरफ़्लो आइटम:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/someItemNotToHide1"
        android:title="ITEM"
        app:showAsAction="always" />

    <item
        android:id="@+id/someItemNotToHide2"
        android:icon="@android:drawable/ic_menu_search"
        app:showAsAction="collapseActionView|ifRoom"
        app:actionViewClass="android.support.v7.widget.SearchView"
        android:title="Search"/>

    <group android:id="@+id/overFlowItemsToHide">
    <item android:id="@+id/someID" 
    android:orderInCategory="1" app:showAsAction="never" />
    <item android:id="@+id/someID2" 
    android:orderInCategory="1" app:showAsAction="never" />
    <item android:id="@+id/someID3" 
    android:orderInCategory="1" app:showAsAction="never" />
    </group>
</menu>

फिर, आपकी गतिविधि पर (onrereOptionsMenu पर बेहतर), कमांड सेट समूह समूह का उपयोग सभी मेनू आइटम दृश्यता को झूठी या सत्य पर सेट करने के लिए करें।

public boolean onCreateOptionsMenu(Menu menu) {
   menu.setGroupVisible(R.id.overFlowItems, false); // Or true to be visible
}

यदि आप अपनी गतिविधि पर कहीं और इस आदेश का उपयोग करना चाहते हैं, तो मेनू कक्षा को स्थानीय में सहेजना सुनिश्चित करें, और हमेशा जांचें कि मेनू शून्य है या नहीं, क्योंकि आप createOptionsMenu से पहले निष्पादित कर सकते हैं:

Menu menu;

public boolean onCreateOptionsMenu(Menu menu) {
       this.menu = menu;

}

public void hideMenus() {
       if (menu != null) menu.setGroupVisible(R.id.overFlowItems, false); // Or true to be visible       
}





Related