Android 以编程方式创建一个简单的菜单
Posted
技术标签:
【中文标题】Android 以编程方式创建一个简单的菜单【英文标题】:Android Create a simple menu programmatically 【发布时间】:2013-02-17 22:48:33 【问题描述】:我正在尝试创建一个带有一个按钮的简单菜单,该按钮将调用一种方法来清除数组。我不想使用 xml,因为我只需要一个按钮。
类似的东西-
public boolean onCreateOptionsMenu(Menu menu)
button "Clear Array";
onClick// run method that wipes array;
return true;
谢谢
【问题讨论】:
【参考方案1】:A--C 的方法有效,但您应该避免手动设置点击侦听器。尤其是当您有多个菜单项时。
我更喜欢这种方式:
private static final int MENU_ITEM_ITEM1 = 1;
...
@Override
public boolean onCreateOptionsMenu(Menu menu)
menu.add(Menu.NONE, MENU_ITEM_ITEM1, Menu.NONE, "Item name");
return true;
@Override
public boolean onOptionsItemSelected(MenuItem item)
switch (item.getItemId())
case MENU_ITEM_ITEM1:
clearArray();
return true;
default:
return false;
通过使用这种方法,您可以避免创建不必要的对象(侦听器),而且我还发现这段代码更易于阅读和理解。
【讨论】:
我也喜欢这个。以后肯定会用这个 +1,但是:在 android 4 上?编译器错误,因为 return 语句后的 break。我会尝试编辑它,完成 > "A--C 的方法有效,但您应该避免手动设置点击侦听器。尤其是当您有多个菜单项时。"但为什么?直接在每个菜单项上添加监听器有什么不好? (对我来说,让每个项目的信息+反应独立,而不是分成两个地方似乎更易于维护) 除非有人能证明为什么应该避免手动设置点击监听器,否则我同意 Venryx!【参考方案2】:这样的事情可能会奏效:
public boolean onCreateOptionsMenu(Menu menu)
MenuItem item = menu.add ("Clear Array");
item.setOnMenuItemClickListener (new OnMenuItemClickListener()
@Override
public boolean onMenuItemClick (MenuItem item)
clearArray();
return true;
);
return true;
Menu
为我们提供了一个方便的方法,add()
,它允许您添加一个 MenuItem。所以我们做一个。
然后我们将OnMenuItemClickListener
分配给MenuItem
并覆盖其onMenuItemClick()
以执行我们希望它执行的操作。
【讨论】:
@David 没问题。由于您只需要一个按钮(就像您在问题中指定的那样),这很好,并且占用的代码更少。但正如 Paul 所说,如果您有多个按钮,建议您采用这种方法。 谁推荐的?【参考方案3】:通过编程,我能够使用以下代码创建一个简单的菜单。
private final int MenuItem_EditId = 1, MenuItem_DeleteId = 0;
@Override
public boolean onCreateOptionsMenu(Menu menu)
MenuItem edit_item = menu.add(0, MenuItem_EditId, 0, R.string.edit);
edit_item.setIcon(R.drawable.edit);
edit_item.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM);
MenuItem delete_item = menu.add(0, MenuItem_DeleteId, 1, R.string.edit);
delete_item.setIcon(R.drawable.delete);
delete_item.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM);
return super.onCreateOptionsMenu(menu);
【讨论】:
【参考方案4】:这里我使用点击监听器动态实现了弹出菜单。
Dynamic_PopUpMenu.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
PopupMenu menu = new PopupMenu(DialogCheckBox.this, v);
menu.getMenu().add("AGIL"); // menus items
menu.getMenu().add("Dash"); // menus items
menu.getMenu().add("AGILarasan");
menu.getMenu().add("Arasan");
menu.show();
);
【讨论】:
【参考方案5】:如果您正在寻找带有回调的生成弹出项目,请使用这个。
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("Clear Array", new Utils.IPopupMenu()
@Override
public void onClick()
//clear array
);
popupMenu(context,button,menu_items);
【讨论】:
【参考方案6】:在 Kotlin 中,您可以像这样动态添加菜单项:
class MyFragment : MyBasicFragment()
companion object
const val MENU_ITEM_ID_UPDATE = 0
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater)
// consider you have called 'inflater.inflate(R.menu.app_bar_menu, menu)' in the MyBasicFragment
super.onCreateOptionsMenu(menu, inflater)
menu.add(0, MENU_ITEM_ID_UPDATE, 0, R.string.menu_item_update).apply
setIcon(R.drawable.ic_baseline_refresh_24)
setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
【讨论】:
以上是关于Android 以编程方式创建一个简单的菜单的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式创建 Cocoa 应用程序主菜单应用程序 [关闭]
如何以编程方式创建 Menu 实例?即在 onCreateOptionsMenu 之外膨胀一个菜单