एंड्रॉइड: विकल्प मेनू आइटम को प्रोग्रामेटिक रूप से बदलना


89

क्या कार्यक्रम मेनू आइटम को प्रोग्रामेटिक रूप से बदलना संभव है? क्या कोई मुझे एक उदाहरण प्रदान कर सकता है?

इसके अलावा, मैं कुछ वस्तुओं को निष्क्रिय करना चाहता हूं, ताकि वे क्लिकों को न सुनें, क्या यह संभव है?

जवाबों:


211

किसी को भी मेनू के विकल्पों को गतिशील रूप से बदलने की आवश्यकता है:

private Menu menu;

// ...

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    this.menu = menu;
    getMenuInflater().inflate(R.menu.options, menu);
    return true;
}

// ...

private void hideOption(int id)
{
    MenuItem item = menu.findItem(id);
    item.setVisible(false);
}

private void showOption(int id)
{
    MenuItem item = menu.findItem(id);
    item.setVisible(true);
}

private void setOptionTitle(int id, String title)
{
    MenuItem item = menu.findItem(id);
    item.setTitle(title);
}

private void setOptionIcon(int id, int iconRes)
{
    MenuItem item = menu.findItem(id);
    item.setIcon(iconRes);
}

8
एक चेतावनी यह है कि आपको यह सुनिश्चित करना होगा कि इसे बाहर निकालने के menuप्रयास से पहले सेट किया गया MenuItemहै। उदाहरण के लिए, आप की तरह कुछ पूछना चाहते हैं तो actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS), टैब मेनू से पहले लोड किए गए हैं, इसलिए बुला hideOption/ showOptionभीतर onTabSelectedएक नल पॉइंटर एक्सेप्शन में परिणाम है।
साल्वनट्स

जब मैं उपयोग करता हूं item.setVisible(false);, तो केवल मेनू पर क्लिक करने पर आइटम छिप जाता है। यदि मैं invalidateOptionsMenu();आइटम का उपयोग करता हूं तो क्लिक करने के लिए प्रतिक्रिया न करें। मैं सराहना करता हूं कि क्या आप इसी तरह के मुद्दे पर मेरी मदद कर सकते हैं जो मैं सामना कर रहा हूं। stackoverflow.com/questions/54756799/…
एलिटॉन ओलिवेरा

@AlitonOliveira को आपको अपने फ्लैग वेरिएबल स्टेटस की जांच करके onCreateOptionsMenu मेथड के अंदर अपना आइटम.सेटिविजिबिलिटी (गलत) भाग डालना चाहिए और आपको अपने फ्लैग और अमान्य अकाउंट्स जेनुइन की बूल वैल्यू बदलनी चाहिए। यह काम करेगा।
किडस टेकेस्टे

setVisibleराज्यों का प्रलेखन जिसे आपको भी कॉल करना चाहिए setEnabled(false)अन्यथा आइटम अभी भी शॉर्टकट के माध्यम से मंगाया जा सकता है
फ्लोरियन वाल्थर

34

menu.xml

  <item 
    android:id="@+id/item1"
    android:title="your Item">
  </item>

अपनी जावा फ़ाइल में डालें

  public void onPrepareOptionsMenu(Menu menu) {

    menu.removeItem(R.id.item1);
}

यह वही है जिसकी मैं तलाश कर रहा था क्योंकि मैं एक बार रनटाइम के दौरान निर्णय लेना चाहता हूं लेकिन बाद में विकल्पों को बदलने की आवश्यकता नहीं है। मैंने इस्तेमाल किया: @Override सार्वजनिक बूलियन onPrepareOptionsMenu (मेन्यू मेनू) {if ((showItemName) {menu.removeItem (R.id.itemname); } सच लौटना; }
notmystyle

20

जैसे निकोले ने कहा कि onPrepareOptionsMenu () में करो।

एक्शन बार में मेनू आइटम के लिए आपको मेनू को अमान्य करना होगा activity.invalidateOptionsMenu();

यह यहाँ और अधिक विस्तार से वर्णन किया गया है कि मैं कैसे चालू कर सकता हूं जब एवरबेर को ऑनप्रेपरऑउंसमेन्स मीनू स्विच की गई मेनू एंट्रीज?


7

अगर मुझे अपने विकल्प मेनू की सामग्री को बदलना है तो मैं इसे ऑनमेन्यूपेंड () के दौरान करता हूं। यह मुझे उसी क्षण चालू स्थिति की जांच करने की अनुमति देता है जो उपयोगकर्ता मेनू तक पहुंच रहा है।

public boolean onMenuOpened(int featureid, Menu menu)
    {
        menu.clear();
        if (!editable)
        {
            MenuItem itemAdd = menu.add(0, REASSIGN, Menu.NONE, context.getString(R.string.reassign));
            MenuItem itemMod = menu.add(1, EDIT, Menu.NONE, context.getString(R.string.modify));
            MenuItem itemDel = menu.add(2, DELETE, Menu.NONE, context.getString(R.string.delete));
            itemAdd.setShortcut('0', 'a');
            itemMod.setShortcut('1', 'm');
            itemDel.setShortcut('2', 'd');
        }
        else
        {
            MenuItem itemSave = menu.add(3, SAVE, Menu.NONE, context.getString(R.string.savechanges));
            itemSave.setShortcut('0', 'S');
        }


        return true;
    }

टिप्पणी के कुछ शब्द। onMenuOpened को दो बार कहा जाता है। पहली बार मेनू संस्करण शून्य है, दूसरा समय मेनू संस्करण का उपयोग करने के लिए तैयार किया गया है। मैं हमेशा 'if' क्लॉज़ का उपयोग करता हूँ यह जाँचने के लिए कि क्या मेनू var अशक्त नहीं है।
केसीडज़ पिस्टोलेट

7

कुछ वस्तुओं को निष्क्रिय करने के लिए:

MenuItem item = menu.findItem(R.id.ID_ASSING_TO_THE_ITEM_IN_MENU_XML);
item.setEnabled(false);

जब मैं सेट करता हूं item.setVisible(false);, तो मेरा आइटम केवल तब छिपा होता है जब मैं मेनू पर ही क्लिक करता हूं (तीन डॉट्स)। अगर मैं invalidateOptionsMenu();कुछ वस्तुओं का उपयोग करता हूं तो क्लिक करने के लिए प्रतिक्रिया न करें। मैं सराहना करता हूं कि क्या आप इसी तरह के मुद्दे पर मेरी मदद कर सकते हैं जो मैं सामना कर रहा हूं। stackoverflow.com/questions/54756799/…
एलिटोन ओलिवेरा

4

मेनू में मान जोड़ने के लिए मैंने निम्नलिखित पंक्तियों का उपयोग किया है

getActivity().invalidateOptionsMenu();

मेरे लिए एक आकर्षण की तरह इस काम की कोशिश करो।


3

इस कोड को आज़माएं:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    this.menu=menu;
    updateMenuItems(menu);
    return super.onPrepareOptionsMenu(menu);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.document_list_activity_actions, menu);
    return super.onCreateOptionsMenu(menu);
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle presses on the action bar items
    if (item.getItemId() == android.R.id.home) {
        onHomeButtonPresssed();
    }else if (item.getItemId() == R.id.action_delete) {
        useCheckBoxAdapter=false;
        deleteDocuments();
    } else if (item.getItemId() == R.id.share) {
        useCheckBoxAdapter=false;
        shareDocuments();
    } else if (item.getItemId() == R.id.action_tick) {
        useCheckBoxAdapter=true;
        onShowCheckboxes();
    }
    updateMenuItems(menu);
    return true;
}

private void updateMenuItems(Menu menu){
    if (useCheckBoxAdapter && menu != null) {
        menu.findItem(R.id.action_delete).setVisible(true);
        menu.findItem(R.id.share).setVisible(true);
        menu.findItem(R.id.action_tick).setVisible(false);
    } else {
        menu.findItem(R.id.action_delete).setVisible(false);
        menu.findItem(R.id.share).setVisible(false);
        menu.findItem(R.id.action_tick).setVisible(true);
    }
    invalidateOptionsMenu();
}

जब मैं उपयोग करता हूं invalidateOptionsMenu();, मेरे हमेशा दिखाई देने वाले आइटम काम करना बंद कर देते हैं (मेरा मतलब है कि आइटम क्लिक करने के लिए प्रतिक्रिया नहीं देते हैं)। मैं सराहना करता हूं कि क्या आप इसी तरह के मुद्दे पर मेरी मदद कर सकते हैं जो मैं सामना कर रहा हूं। stackoverflow.com/questions/54756799/…
एलिटोन ओलिवेरा

2

आप कुछ सरल कर सकते हैं जैसे मैंने किया। मेनू आइटम को छूने पर जो आवश्यक है उसे बस टेक्स्ट में बदलें। मुझे ध्वनि को बंद करने और चालू करने की आवश्यकता थी, साथ ही इसे छूने से कार्रवाई करने की क्षमता। यहाँ मेरा कोड है:

    @Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
    case R.id.audioOn:
        audioOn = !audioOn;
        if (audioOn)
            item.setTitle("Audio Off");
        else
            item.setTitle("Audio On");
        return true;

    case R.id.touchOn:
        touchOn = !touchOn;
        if (touchOn)
            item.setTitle("Touch Off");
        else
            item.setTitle("Touch On");
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

ऑडियोऑन और टचऑन कोड के अन्य भागों में चेक किए गए बूलियन हैं। उम्मीद है की यह मदद करेगा।


मैं इसे गतिशील रूप से कैसे कर सकता हूं। मेरा मतलब है ... एक ऑप्शन आइटम का चयन करने पर और फिर इसकी सफल प्रतिक्रिया पर एक वेबबेस को कॉल करना ... onCreateOptionsMenu को फिर से कॉल करना। ऐसा कैसे करें?
नरेंद्र सिंह

1

आप नीचे के रूप में लागू करके अपना काम पूरा कर सकते हैं:

private Menu menu;

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.drive_menu, menu);
    return true;
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    this.menu = menu;
    return super.onPrepareOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == R.id.action_toggle_grid) {
        handleMenuOption(id);
        return true;

    } else if(id == R.id.action_toggle_list){
        handleMenuOption(id);
        return true;
    }

    return super.onOptionsItemSelected(item);
}

private void handleMenuOption(int id) {
    MenuItem item = menu.findItem(id);
    if (id == R.id.action_toggle_grid){
        item.setVisible(false);
        menu.findItem(R.id.action_toggle_list).setVisible(true);
    }else if (id == R.id.action_toggle_list){
        item.setVisible(false);
        menu.findItem(R.id.action_toggle_grid).setVisible(true);
    }
}

1

मामले में आपके पास एक बॉटबर है:

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    if (mBottomBar.getCurrentTabId() == R.id.tab_more) {
        getMenuInflater().inflate(R.menu.more_menu, menu);
    }

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.preferences:
            startActivity(new Intent(this, PreferenceActivity.class));
            break;
    }

    return super.onOptionsItemSelected(item);
}

फिर आपको बस कॉल करने की आवश्यकता है:

@Override
public void onBottomBarClick(int tabId) {
    supportInvalidateOptionsMenu();
}

1

उपकरण पट्टी विकल्प तक पहुँचने के लिए कोटलिन कोड

1-हम मेनू आइटम फ़ाइल में हमारे मेनू आइटम की तरह है: 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">
<item android:id="@+id/balance"
      android:title="0"
      android:orderInCategory="100"
      app:showAsAction="always" />
 </menu>

2- कक्षा में मेनू ऑब्जेक्ट तक पहुँचने के लिए एक चर को परिभाषित करें:

var menu: Menu? = null

3- ऑनक्रिएट ऑउटफिट्स में इसे शुरू करें: मीनू:

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    // Inflate the menu; this adds items to the action bar if it is present.
    menuInflater.inflate(R.menu.main, menu)
    this.menu = menu
    return true
}

4- अपने कोड या मस्ती के अंदर मेनू आइटम एक्सेस करें:

private fun initialBalanceMenuItemOnToolbar() {
var menuItemBalance = menu?.findItem(R.id.balance)
    menuItemBalance?.title = Balance?.toString() ?: 0.toString()
    // for change icon : menuWalletBalance?.icon
}

1
@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.calendar, menu);
        if(show_list == true) {         

        if(!locale.equalsIgnoreCase("sk")) menu.findItem(R.id.action_cyclesn).setVisible(false);

        return true;
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.