77

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

4

9 に答える 9

143

ちょうどそれを理解しました。この同じ問題に遭遇した人のためにあなたはただします:

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

MenuItem追加したいそれぞれに。

于 2012-12-09T02:53:37.600 に答える
47

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

PopupMenu menu = new PopupMenu(this, view);

menu.getMenu().add("titleRes");
menu.show();
于 2013-01-12T09:11:40.333 に答える
27

これを試して:

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();
    }
});
于 2016-12-07T04:39:46.493 に答える
21

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;
        }
    }
于 2015-12-28T14:24:16.760 に答える
16

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などにしたい場合...

于 2016-09-18T15:40:24.113 に答える
5

@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.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();
    }
于 2016-09-06T08:16:31.473 に答える
3

Javaでは

     private void getPopup(Activity sContext,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();
        }

Kotlinで

private fun getPopup(
    sContext: Activity,
    textView: TextView,
    arrayList: ArrayList<String>
) {
    val popupMenu = PopupMenu(sContext, textView)
    for (i in 0 until arrayList.size) {
        popupMenu.getMenu().add(i, Menu.FIRST, i, arrayList[i])
    }
    popupMenu.setOnMenuItemClickListener(object : 
        PopupMenu.OnMenuItemClickListener {
        override fun onMenuItemClick(item: MenuItem): Boolean {
            textView.setText(item.getTitle())
            return false
        }
    })
    popupMenu.show()
}
于 2019-09-17T10:13:44.813 に答える
0

コールバックで生成されたポップアップアイテムを探している場合は、これを使用します。

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>

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);
于 2020-04-21T04:09:25.230 に答える
0

文字列配列リソースから

値>strings.xml

<string-array name="MainCategories">
        <item>Crop</item>
        <item>Animals</item>
        <item>Equipment</item>
        <item>Other</item>
    </string-array>

Javaコード:

    String []categories=getResources().getStringArray(R.array.MainCategories);
    PopupMenu popupMenu=new PopupMenu(MainActivity.this,sortExpenseBtn);

                for(String item: categories)
                    popupMenu.getMenu().add(item);

                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        String selected = item.getTitle();
                        return true;
                    }
                });
                popupMenu.show();
于 2021-09-17T12:55:37.663 に答える