【问题标题】:Android Create a simple menu programmaticallyAndroid 以编程方式创建一个简单的菜单
【发布时间】:2013-02-17 22:48:33
【问题描述】:

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

类似的东西-

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

谢谢

【问题讨论】:

    标签: android menu


    【解决方案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)
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2011-11-11
            • 1970-01-01
            • 2011-09-21
            • 1970-01-01
            • 1970-01-01
            • 2012-09-20
            • 1970-01-01
            • 2018-04-19
            • 2023-03-18
            相关资源
            最近更新 更多