以编程方式设置PopupMenu菜单项
我有一个PopupMenu
,我知道通常的方法来关联一个菜单是使用popup.getMenuInflater().inflate(R.menu.my_menu, popup.getMenu());
或类似的东西。 我的问题是,我有一个项目,我想在菜单中的数组,我需要能够在Java中以编程方式进行更改。 我怎样才能做到这一点?
谢谢!
刚刚搞清楚了; 对于遇到同样问题的任何人,你只需要:
popup.getMenu().add(groupId, itemId, order, title);
为每个你想添加的MenuItem
。
只需创buildpopup菜单,注册popup窗口将显示的视图,并使用getMenu()方法添加值。 不要忘记打电话给show();
PopupMenu menu = new PopupMenu(this, view); menu.getMenu().add("titleRes"); menu.show();
在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; } }
对。! 它会帮助你。 尝试这个:)
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("Dash"); menu.getMenu().add("AGILarasan"); menu.getMenu().add("Arasan"); menu.show(); } });
@Voora Tarun给出了一个很好的答案,我根据我的回答:首先使用假mune.xml
资源,我认为更好的方法是创buildids
文件:
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(); }
这是一个完整的解决scheme,设置和处理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等…