web-dev-qa-db-fra.com

Afficher le menu contextuel sur l'élément de la barre d'actions

J'ai un ActionBar avec un élément d'action dessus. Après avoir cliqué sur l'élément d'action, je souhaite afficher un menu contextuel. J'ai implémenté cette méthode, mais je veux l'ancrer à l'élément d'action ou à ActionBar, pas à une vue de la disposition. Comment obtenir une sorte de vue pour l'ancrer à partir de MenuItem?

public boolean onOptionsItemSelected(MenuItem item) {
    PopupMenu popupMenu = new PopupMenu(this, ??????); // What view goes here?
    popupMenu.inflate(R.menu.counters_overflow);
    popupMenu.show();
    // ...
    return true;
}
47
pcu

J'ai finalement trouvé une solution. Lorsque vous souhaitez ancrer le menu contextuel à ActionItem dans ActionBar, vous devez trouver une vue qui rend ActionItem. Vue de recherche simple avec findViewById () où id est identique à l'id de votre élément de menu en xml.

AFFICHAGE DE LA POPUP:

public boolean onOptionsItemSelected(MenuItem item) {
    // ...

    View menuItemView = findViewById(R.id.menu_overflow); // SAME ID AS MENU ID
    PopupMenu popupMenu = new PopupMenu(this, menuItemView); 
    popupMenu.inflate(R.menu.counters_overflow);
    // ...
    popupMenu.show();
    // ...
    return true;
}

MENU:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" >

     ....

     <item
    Android:id="@+id/menu_overflow"
    Android:icon="@drawable/ic_overflow"
    Android:showAsAction="ifRoom"
    Android:title="@string/menu_overflow"/>

     ....

</menu>

Si l'élément de menu n'est pas visible (est en débordement), cela ne fonctionne pas. findViewById renvoie null, vous devez donc vérifier cette situation et ancrer à une autre vue.

115
pcu