59

我正在尝试使用一个按钮创建一个简单的菜单,该按钮将调用一种方法来清除数组。我不想使用 xml,因为我只需要一个按钮。

像这样的东西-

public boolean onCreateOptionsMenu(Menu menu) {
    button "Clear Array";
    onClick{// run method that wipes array};
    return true;
}

谢谢

4

6 回答 6

85

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

通过使用这种方法,您可以避免创建不必要的对象(侦听器),而且我还发现此代码更易于阅读和理解。

于 2013-03-03T22:23:32.260 回答
32

像这样的东西可能会起作用:

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()来做我们想要它做的事情。

于 2013-03-03T22:18:24.527 回答
25

以编程方式,我能够使用以下代码创建一个简单的菜单。

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);
}
于 2015-06-13T07:17:15.073 回答
6

在这里,我使用点击监听器动态实现了弹出菜单。

    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();
        }
    });
于 2018-11-09T04:53:31.373 回答
2

如果您正在寻找带有回调的生成弹出项目,请使用此。

爪哇

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);
于 2020-04-20T23:11:09.670 回答
0

在 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)
        }
    }
}
于 2021-12-09T18:11:16.277 回答