web-dev-qa-db-fra.com

Définition des éléments de menu PopupMenu par programme

J'ai un PopupMenu et je sais que la manière habituelle d’y associer un menu est d’utiliser popup.getMenuInflater().inflate(R.menu.my_menu, popup.getMenu()); ou quelque chose du genre. Mon problème est que j'ai un tableau d'éléments que je veux dans le menu et que je dois pouvoir les changer par programme en Java. Comment puis-je faire ceci?

62
roboguy12

Vient de le comprendre; pour tous ceux qui rencontrent le même problème, il suffit de faire:

popup.getMenu().add(groupId, itemId, order, title);

pour chaque MenuItem que vous souhaitez ajouter.

119
roboguy12

Il suffit de créer le menu contextuel enregistrant la vue que celle-ci apparaîtra en dessous et d’utiliser la méthode getMenu () pour ajouter les valeurs. N'oubliez pas d'appeler show ();

PopupMenu menu = new PopupMenu(this, view);

menu.getMenu().add("titleRes");
menu.show();
32
Khaled Annajar

Essaye ça:

Dynamic_PopUpMenu.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        PopupMenu menu = new PopupMenu(DialogCheckBox.this, v);
        menu.getMenu().add("AGIL");         
        menu.getMenu().add("AGILarasan");
        menu.getMenu().add("Arasan");
        menu.show();
    }
});
21
Agilanbu

Définit les identifiants dans popupmenu.xml

<?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/slot1"
            app:showAsAction="ifRoom|withText"
            Android:title="Movies"
            Android:visible="true"/>
        <item
            Android:id="@+id/slot2"
            app:showAsAction="ifRoom|withText"
            Android:title="Music"
            Android:visible="true"/>
        <item
            Android:id="@+id/slot3"
            app:showAsAction="ifRoom|withText"
            Android:title="Comedy"
            Android:visible="true"/>

</menu>  
PopupMenu popupMenu = new PopupMenu(FullMenuActivity.this, view);                      
popupMenu.setOnMenuItemClickListener(FullMenuActivity.this);
popupMenu.getMenu().add(1, R.id.slot1, 1, "slot1");
popupMenu.getMenu().add(1,R.id.slot2,2,"slot2");
popupMenu.getMenu().add(1,R.id.slot3,3,"slot3");
popupMenu.show();
 @Override
    public boolean onMenuItemClick(MenuItem item) {

        switch (item.getItemId()) {
            case R.id.slot1:
                SessionManager.selected_slot = item.getTitle().toString();
                Toast.makeText(this, "slot1 Clicked", Toast.LENGTH_SHORT).show();
                return true;
            case R.id.slot2:
                SessionManager.selected_slot = item.getTitle().toString();
                Toast.makeText(this, "slot2 Clicked", Toast.LENGTH_SHORT).show();
                return true;
            case R.id.slot3:
                SessionManager.selected_slot = item.getTitle().toString();
                Toast.makeText(this, "slot3 Clicked", Toast.LENGTH_SHORT).show();
                return true;
            default:
                return true;
        }
    }
14
Tarun Voora

Voici une solution complète avec les identifiants définis et gérés:

        this.findViewById(R.id.hamburger_menu).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            PopupMenu menu = new PopupMenu(getApplicationContext(), v);
            menu.getMenu().add(Menu.NONE, 1, 1, "Share");
            menu.getMenu().add(Menu.NONE, 2, 2, "Comment");
            menu.show();

            menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {

                    int i = item.getItemId();
                    if (i == 1) {
                        //handle share
                        return true;
                    } else if (i == 2) {
                        //handle comment
                        return true;
                    } else {
                        return false;
                    }
                } 

            });
         }
     });

Remarque: partage et commentaire sont par exemple, vous pouvez également mettre des constantes pour les nombres 1,2 pour rendre le code plus lisible.

Aussi, je mets Menu.NONE parce que je me fiche de regrouper les éléments de menu. Si vous souhaitez que le groupe défini définisse le groupe id = 1, 2, etc.

11
Abdulhamid Dhaiban

@Voora Tarun a donné une bonne réponse, et j'ai basé ma réponse sur celle-ci: D'abord, utilisez plutôt faux mune.xml ressources, je pense que la meilleure approche consiste à créer le fichier ids à la place:

ids.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="menuGroup" type="id"/>
    <item name="menu1" type="id"/>
    <item name="menu2" type="id"/>
    <item name="menu3" type="id"/>
</resources>

Ensuite, vous pouvez faire quelque chose comme ça:

private void showPopup(final View anchor) {
        PopupMenu popupMenu = new PopupMenu(anchor.getContext(), anchor);
        popupMenu.getMenu().add(R.id.menuGroup, R.id.menu1, Menu.NONE, "slot1");
        popupMenu.getMenu().add(R.id.menuGroup, R.id.menu1, Menu.NONE,"slot2");
        popupMenu.getMenu().add(R.id.menuGroup, R.id.menu1, Menu.NONE,"slot3");
        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Toast.makeText(anchor.getContext(), item.getTitle() + "clicked", Toast.LENGTH_SHORT).show();
                return true;
            }
        });
        popupMenu.show();
    }
3
yshahak