web-dev-qa-db-fra.com

Android: Obtenir la référence de la vue à un élément de menu

Je prévois d'utiliser un schéma d'interface utilisateur pour les actions rapides dans mon application. Modèle d'interface utilisateur des actions rapides Android . La fenêtre d'action rapide nécessite une vue pivot à laquelle s'en tenir. 

    quickAction.show(View pivotView);

J'ai l'intention d'utiliser l'action rapide pour l'élément de menu, je peux accéder à l'élément sur lequel vous cliquez. Mais le problème est que je dois référencer une vue à partir de l'élément de menu afin de pouvoir la transmettre à l'action rapide. 

Comment puis-je obtenir une référence à une vue dans le menuItem qui est sélectionné.

43
Yashwanth Kumar

Vous pouvez y parvenir en fournissant à votre élément de menu une propriété actionViewClass au format XML. Vous pourrez alors obtenir la vue pivot que vous souhaitez. Le code serait quelque chose comme ça 

<item
    Android:id="@+id/menu_find"
    Android:showAsAction="ifRoom"
    Android:actionViewClass="Android.widget.ImageButton"
    />

Faites ceci dans votre menu OnCreateOptions

public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    getMenuInflater().inflate(R.menu.menu_search, menu);
    locButton = (ImageButton) menu.findItem(R.id.menu_find).getActionView();
    locButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            createPopup();
            mQuickAction.show(v);
        }
    });
    return true;
}
89
ASH

Vieille question, mais j'ai rencontré quelques problèmes avec l'attribut actionViewClass. Pour quiconque se heurte à cela plus tard ...

L'appel de findViewById(R.id.mnu_item) dans onOptionsItemSelected renverra une ancre View.

QuickActions sur la MenuItems ne sont pas une bonne conception, mais j’ai trouvé qu’elles étaient le moyen le plus simple d’implémenter des sous-menus avec des arrière-plans personnalisés.

35
loadedion

Afin de obtenir des vues de référence des éléments de menu nous devons le faire,

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.section, menu);

    new Handler().post(new Runnable() {
        @Override
        public void run() {

            final View menuItemView = findViewById(R.id.action_preview);
            // SOME OF YOUR TASK AFTER GETTING VIEW REFERENCE

        }
    });


    return true;
}
4
jazzbpn

Une mise à jour pour quiconque veut trouver l'élément de vue de menu pour d'autres raisons (comme je voulais).

Si vous avez accès à la barre d'outils d'AppCompat et que vous l'utilisez, il existe un moyen. Ce n'est pas le moyen le plus efficace, mais c'est le moyen le plus simple que j'ai trouvé d'accéder à la vue de l'élément de menu.

public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);

    // Find Menu
    for (int toolbarChildIndex = 0; toolbarChildIndex < toolbar.getChildCount(); toolbarChildIndex++) {
        View view = toolbar.getChildAt(toolbarChildIndex);

        // Found Menu
        if (view instanceof ActionMenuView) {
            ActionMenuView menuView = (ActionMenuView) view;

            // All menu items
            for (int menuChildIndex = 0; menuChildIndex < menuView.getChildCount(); menuChildIndex++) {
                ActionMenuItemView itemView = (ActionMenuItemView) menuView.getChildAt(menuChildIndex);
                // Do something to itemView...
            }
        }
    }
}
2
Senth

dans la classe d'activité principale, il est préférable de remplacer la méthode onOptionsItemSelected (...); devrait être quelque chose comme ci-dessous:

public boolean onOptionsItemSelected(MenuItem item) {
  // the id is of type int
  int someId = item.getItemId();
  // can use an if() or switch() statement to check if id is selected
  //a Toast message can be used to show item is selected
}
0
odins

Vous pouvez obtenir une référence à un élément de menu comme ceci:

MenuItem btnFavorites = menu.findItem(R.id.action_favorite);

Et ensuite faites ce que vous voulez avec. Par exemple. change son icône comme ceci:

btnFavorites.setIcon(R.drawable.ic_favorite_false); 
0
Ivo Stoyanov