web-dev-qa-db-ja.com

PopupMenuメニュー項目をプログラムで設定する

PopupMenuがあり、メニューをそれに関連付ける通常の方法はpopup.getMenuInflater().inflate(R.menu.my_menu, popup.getMenu());などを使用することです。私の問題は、メニューに必要な項目の配列があり、Javaでプログラムで変更できるようにする必要があることです。これどうやってするの?

62
roboguy12

ちょうどそれを考え出した。この同じ問題に遭遇した人のためにあなたはただやる:

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

追加するMenuItemごとに。

119
roboguy12

ポップアップが下に表示されるビューを登録するポップアップメニューを作成し、getMenu()メソッドを使用して値を追加します。 show()を呼び出すことを忘れないでください。

PopupMenu menu = new PopupMenu(this, view);

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

これを試して:

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

Popupmenu.xmlでIDを定義します

<?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

IDを設定および処理する完全なソリューションを次に示します。

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

            });
         }
     });

注:共有とコメントは、たとえば、コードを読みやすくするために数字1,2の定数を置くこともできます。

また、Menu.NONE私はメニュー項目をグループ化することを気にしないからです。グループセットをグループID = 1、2などにしたい場合...

11

@Voora Tarunが良い答えを出したので、私はそれに基づいて私の答えを基にしました:最初に代わりに偽のmune.xmlリソース、より良いアプローチはidsファイルを作成することだと思います:

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>

その後、あなたはそのようなことをすることができます:

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