Android: modification des éléments du menu d'options par programme


89

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

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

Réponses:


211

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

8
Une mise en garde est que vous devez vous assurer que cela menua été défini avant d'essayer d'en sortir MenuItem. Par exemple, si vous avez quelque chose comme actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS), les onglets sont chargés avant le menu, donc l'appel de hideOption/ showOptionwithin onTabSelectedentraîne une exception de pointeur nul.
SaltyNuts

Lorsque j'utilise item.setVisible(false);, l'élément n'est masqué que lorsque je clique sur le menu lui-même. Si j'utilise invalidateOptionsMenu();l'élément, ne répondez pas au clic. J'apprécie si vous pouviez m'aider sur un problème similaire auquel je suis confronté. stackoverflow.com/questions/54756799/…
Aliton Oliveira

@AlitonOliveira vous devez mettre votre partie item.setVisibility (false) dans la méthode onCreateOptionsMenu en vérifiant le statut de votre variable d'indicateur et vous devez changer la valeur booléenne de votre indicateur et invaliderOptionsMenu. ça va marcher.
Kidus Tekeste

La documentation des setVisibleétats que vous devez également appeler setEnabled(false)sinon l'élément peut toujours être invoqué via son raccourci
Florian Walther

34

menu.xml

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

mettez votre fichier java

  public void onPrepareOptionsMenu(Menu menu) {

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

C'est celui que je recherchais car je veux prendre la décision une fois à l'exécution mais je n'ai pas besoin de changer les options après. J'ai utilisé: @Override public boolean onPrepareOptionsMenu (Menu menu) {if (! ShowItemName) {menu.removeItem (R.id.itemname); } retourne vrai; }
notmystyle


7

Si je dois changer le contenu de mon menu d'options, je l'exécute pendant le 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;
    }

Quelques mots de commentaire. onMenuOpened est appelé deux fois. La première fois que le menu var est nul, la deuxième fois que le menu var est préparé pour l'utilisation. J'utilise toujours la clause 'if' pour vérifier si le menu var n'est pas nul.
Ksiądz Pistolet

7

Pour désactiver certains éléments:

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

Lorsque je définis item.setVisible(false);, mon élément n'est masqué que lorsque je clique sur le menu lui-même (trois points). Si j'utilise invalidateOptionsMenu();certains éléments, je ne réponds pas au clic. J'apprécie si vous pouviez m'aider sur un problème similaire auquel je suis confronté. stackoverflow.com/questions/54756799/…
Aliton Oliveira

4

en utilisant les lignes suivantes que j'ai faites pour ajouter les valeurs dans le menu

getActivity().invalidateOptionsMenu();

essayez ce travail comme un charme pour moi.


3

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

Lorsque j'utilise invalidateOptionsMenu();, mes éléments toujours visibles cessent de fonctionner (je veux dire que les éléments ne répondent pas au clic). J'apprécie si vous pouviez m'aider sur un problème similaire auquel je suis confronté. stackoverflow.com/questions/54756799/…
Aliton Oliveira

2

Vous pouvez faire quelque chose de simple comme moi. Changez simplement le texte selon ce qui est nécessaire lorsque vous appuyez sur l'élément de menu. J'avais besoin d'éteindre et d'allumer le son, plus la possibilité d'effectuer une action en le 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 vérifiés dans d'autres parties du code. J'espère que cela t'aides.


Comment puis-je faire cela dynamiquement. Je veux dire ... appeler un webservice sur la sélection d'un élément d'option, puis sur sa réponse réussie ... ré-appeler onCreateOptionsMenu. Comment faire cela?
Narendra Singh

1

vous pouvez accomplir votre tâche simplement en mettant en œuvre comme ci-dessous:

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

Dans le cas où vous avez un 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

Code Kotlin pour accéder aux options de la barre d'outils par programme et modifier le texte / l'icône, ..:

1-Nous avons notre élément de menu dans le fichier des é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 à l'objet menu en classe:

var menu: Menu? = null

3- paraphez-le 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 amusez-vous:

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;
    }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.