web-dev-qa-db-fra.com

Comment déclencher/cliquer par programme sur un MenuItem dans Android?

J'ai ces éléments de menu dans mon menu_main.xml

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    tools:context=".MainActivity">

    <item Android:id="@+id/action_restart" Android:title="Restart"
        Android:orderInCategory="1" />
    <item Android:id="@+id/action_clear" Android:title="Clear"
        Android:orderInCategory="2" />
    <item Android:id="@+id/action_update" Android:title="Update"
        Android:orderInCategory="3" />
    <item Android:id="@+id/action_about" Android:title="About"
        Android:orderInCategory="4" />
    <item Android:id="@+id/action_try_restart" Android:title="Try Restart"
        Android:orderInCategory="5" />
</menu>

Et j'ai ceci dans ma méthode onOptionsItemSelected:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    if (id == R.id.action_restart) {
        Toast.makeText(MainActivity.this, "Restart...", Toast.LENGTH_LONG).show();
    }

    if (id == R.id.action_clear) {
        Toast.makeText(MainActivity.this, "Clear...", Toast.LENGTH_LONG).show();
    }

    if (id == R.id.action_update) {
        Toast.makeText(MainActivity.this, "Update...", Toast.LENGTH_LONG).show();
    }

    if (id == R.id.action_about) {
        Toast.makeText(MainActivity.this, "About...", Toast.LENGTH_LONG).show();
    }

    if(id == R.id.action_try_restart) {
        // how to click / trigger the "action_restart" from here?
    }

    return super.onOptionsItemSelected(item);
}

J'ai essayé avec:

MenuItem actionRestart = (MenuItem) findViewById(R.id.action_restart);
actionRestart; //

Mais la référence actionRestart n'offre rien de tel que click, trigger, etc.

Je tiens également à souligner que je suis un débutant dans le développement Android et que je viens du contexte PHP/JavaScript. Ce niveau de Java OOP est tout nouveau pour moi.

20
omerowitz

Autant que je sache, il n’existe dans le SDK aucun mécanisme vous permettant de le faire. Ce n'est certainement pas une pratique courante de faire ce genre de chose.

Je vous recommande de dissocier le plus possible votre logique de l'interface utilisateur réelle, de sorte que vous n'ayez pas besoin de simuler un clic pour déclencher l'action. Puisque vous êtes un développeur Web, cela devrait vous venir assez facilement.

Dans ce cas, vous voudriez refactoriser les toasts dans une méthode distincte (ou plusieurs méthodes), puis appeler cette option lorsque vous cliquez sur l'élément de menu et lorsque vous souhaitez le déclencher manuellement.

Alternativement, vous pouvez essayer de prendre le MenuItem renvoyé par findViewById () et de le transmettre à votre gestionnaire. Mais je ne sais pas si ça va marcher.

8
Veselin Romić

Vous devez appeler manuellement votre écouteur, avec l'élément requis en tant que paramètre.

MenuItem actionRestart = (MenuItem) findViewById(R.id.action_restart);
onOptionsItemSelected(actionRestart);
15
VadymVL

Utilisez la méthode performIdentifierAction , Comme ceci:

menu.performIdentifierAction(R.id.action_restart, 0);
11
Simon

J'aimerais aussi partager ma solution ici. Au lieu d’essayer de cliquer par programme sur un élément de menu, j’ai créé une méthode distincte pour les éléments de menu, et je l’appelle partout où je dois cliquer sur l’élément de menu. La méthode OnOptionsItemSelected se présente comme suit. Comme vous pouvez le constater, j'ai déplacé la logique de clic vers une méthode distincte.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == Android.R.id.home) {
        homeClicked();
    }
    return super.onOptionsItemSelected(item);
}
private void homeClicked(){
    ...
}

Vous pouvez maintenant appeler homeClicked à tout moment si vous devez cliquer sur l'élément de menu par programme.

7

Même si ce n'est pas la meilleure façon de faire,

MenuItem item_your_choice;

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.your_menu, menu);
    item_your_choice = menu.findItem(R.id.item_your_choice);
    return super.onCreateOptionsMenu(menu);
}

 @Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case item_your_choice:
     //do whatever you want
     break;
 }

just Call from any method
  onOptionsItemSelected(item_you_choice);
4
Ajay Shrestha
  1. Créer un menu global

    public Menu mMenu;
    
  2. Affecter le menu à mMenu lors du remplacement de onCreateOptionMenu

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        this.mMenu = menu;
        return super.onCreateOptionsMenu(menu);
    }
    
  3. Appelez l'événement comme ceci:

    if(mMenu != null) {
        MenuItem action = mMenu.findItem(R.id.action_restart);
    
        if(action != null) {
            onOptionsItemSelected(action);
        }
    }
    
2
DenVik

Selon votre exemple pour l'élément de menu ci-dessus: 

<item Android:id="@+id/action_restart" Android:title="Restart"
        Android:orderInCategory="1" />

utilisez la méthode callOnClick():

((ActionMenuItemView)findViewById(R.id.action_restart)).callOnClick();
0
Matt