web-dev-qa-db-fra.com

Android: modification des éléments du menu des options par programmation

Est-il possible de modifier les éléments du menu d'options par programmation? Quelqu'un peut-il me donner un exemple s'il vous plaît?

De plus, je veux désactiver certains éléments pour qu'ils n'écoutent pas les clics, est-ce possible?

82
Farhan

Pour quiconque a besoin de changer les options du menu de manière dynamique:

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);
}
200
Eng.Fouad

menu.xml

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

mettre dans votre Java

  public void onPrepareOptionsMenu(Menu menu) {

    menu.removeItem(R.id.item1);
}
31
Imdad Sarkar

Comme Nikolay a dit faire cela dans onPrepareOptionsMenu ().

Pour les éléments de menu dans la barre d’action, vous devez invalider le menu avec activity.invalidateOptionsMenu();

Ceci est décrit plus en détail ici Comment puis-je actualiser la barre d’action quand onPrepareOptionsMenu a changé d’entrée de menu?

17
corban

Si je dois modifier le contenu de mon menu d'options, je l'exécute pendant onMenuOpened (). Cela me permet de vérifier l'état de fonctionnement au moment même où l'utilisateur accède au menu.

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;
    }
7
Ashterothi

Pour désactiver certains éléments:

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

en utilisant les lignes suivantes, j'ai fait pour ajouter les valeurs dans le menu

getActivity().invalidateOptionsMenu();

essayez ce travail comme un charme pour moi.

4
S HemaNandhini

Essayez ce code:

@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();
}
3
Skywalker

Vous pouvez faire quelque chose de simple comme je l'ai fait. Il suffit de changer le texte pour ce qui est nécessaire lorsque l’élément de menu est touché. J'avais besoin d'activer et de désactiver le son, ainsi que de pouvoir effectuer une action en la touchant. Voici mon code:

    @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);
    }
}

audioOn et touchOn sont des booléens cochés dans d'autres parties du code. J'espère que cela t'aides.

2
bob
@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;
    }
1
user3243679

Si vous avez une BottomBar:

@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);
}

Ensuite, il vous suffit d'appeler:

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

Code Kotlin pour accéder aux éléments de la barre d’outils OptionsMenu par programme et changer le texte/l’icône, ..:

1-Nous avons notre élément de menu dans le fichier d’éléments de menu comme: menu.xml, exemple de code pour cela:

 <?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- Définissez une variable pour accéder à un objet de menu en classe:

var menu: Menu? = null

3- initial dans onCreateOptionsMenu:

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- Accédez aux éléments de menu dans votre code ou plaisir:

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

vous pouvez accomplir votre tâche simplement en mettant en œuvre ce qui suit:

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);
    }
}
0
Chiranjhivi Ghimire