PopupMenu-Menüelemente programmgesteuert einstellen

70

Ich habe ein PopupMenuund ich weiß, dass die übliche Art, ein Menü damit zu verknüpfen, darin besteht, popup.getMenuInflater().inflate(R.menu.my_menu, popup.getMenu());etwas Ähnliches zu verwenden. Mein Problem ist, ich habe eine Reihe von Elementen, die ich im Menü haben möchte, und ich muss in der Lage sein, sie programmgesteuert in Java zu ändern. Wie kann ich das machen?

Suragch
quelle

Antworten:

131

Hab es gerade herausgefunden; Für jeden, der auf dasselbe Problem stößt, tun Sie einfach:

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

für jeden, den MenuItemSie hinzufügen möchten.


quelle
38

Erstellen Sie einfach das Popup-Menü und registrieren Sie die Ansicht, die das Popup darunter anzeigt, und verwenden Sie die Methode getMenu (), um die Werte hinzuzufügen. Vergiss nicht, show () aufzurufen;

PopupMenu menu = new PopupMenu(this, view);

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

Versuche dies:

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

Definiert IDs in 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;
        }
    }
Tarun Voora
quelle
14

Hier ist eine Komplettlösung mit festgelegten und gehandhabten IDs:

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

            });
         }
     });

Hinweis: Teilen und Kommentieren sind beispielsweise auch Konstanten für die Zahlen 1,2, um den Code besser lesbar zu machen.

Außerdem habe ich gesagt, Menu.NONEweil es mir egal ist, die Menüpunkte zu gruppieren. Für den Fall, dass Sie die Gruppe auf Gruppen-ID = 1, 2 usw. setzen möchten ...

Abdulhamid Dhaiban
quelle
3

@Voora Tarun gab eine gute Antwort und ich stützte meine Antwort darauf: Zuerst, anstatt gefälschte mune.xmlRessourcen zu verwenden, denke ich, ist es besser, idsstattdessen eine Datei zu erstellen :

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>

Dann können Sie so etwas tun:

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.menu2, Menu.NONE,"slot2");
        popupMenu.getMenu().add(R.id.menuGroup, R.id.menu3, 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();
    }
Yshahak
quelle
2
 private void getPopup(final TextView textView, ArrayList<String> arrayList) {
        final PopupMenu popupMenu = new PopupMenu(sContext, textView);
        for (int i = 0; i < arrayList.size(); i++) {
            popupMenu.getMenu().add(i, Menu.FIRST, i, arrayList.get(i));
        }
        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                textView.setText(item.getTitle());
                return false;
            }
        });
        popupMenu.show();
    }
Safal Bhatia
quelle
Dies ist ein dynamisches Popup-Menü in Android. Wenn Sie dynamische Daten hinzufügen möchten. Zum Beispiel: - Wenn verwendet wird, um Daten von Apis abzurufen und Daten im Popup anzuzeigen, ist dieser Code sehr hilfreich.
Safal Bhatia
0

Wenn Sie nach generierten Popup-Elementen mit Rückrufen suchen, verwenden Sie diese Option.

Java

public static void popupMenu(final Context context, View anchor, final LinkedHashMap<String,IPopupMenu> options){
        PopupMenu popupMenu = new PopupMenu(context, anchor);
        for(String key : options.keySet()){
            popupMenu.getMenu().add(key);
        }
        popupMenu.getMenuInflater().inflate(R.menu.popup_menu,popupMenu.getMenu());
        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {

                options.get(menuItem.getTitle()).onClick();
                return true;
            }
        });

        popupMenu.show();
    }

public interface IPopupMenu{
        void onClick();
    }

XML

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

</menu>

Beispiel

LinkedHashMap<String,IPopupMenu> menu_items = new LinkedHashMap<>();
menu_items.put("Item Name", new Utils.IPopupMenu() {
         @Override
         public void onClick() {
            //do your code
         }
});
menu_items.put("My Item", new Utils.IPopupMenu() {
         @Override
         public void onClick() {
            //do code
         }
});

//you can anchor the popup menu to whatever you like. i.e Button, TextView, View.
popupMenu(context,button,menu_items);
NJY404
quelle