我正在尝试使用一个按钮创建一个简单的菜单,该按钮将调用一种方法来清除数组。我不想使用 xml,因为我只需要一个按钮。
像这样的东西-
public boolean onCreateOptionsMenu(Menu menu) {
button "Clear Array";
onClick{// run method that wipes array};
return true;
}
谢谢
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;
}
}
通过使用这种方法,您可以避免创建不必要的对象(侦听器),而且我还发现此代码更易于阅读和理解。
像这样的东西可能会起作用:
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
然后我们为 the分配一个MenuItem
并覆盖它onMenuItemClick()
来做我们想要它做的事情。
以编程方式,我能够使用以下代码创建一个简单的菜单。
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);
}
在这里,我使用点击监听器动态实现了弹出菜单。
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();
}
});
如果您正在寻找带有回调的生成弹出项目,请使用此。
爪哇
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);
在 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)
}
}
}