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 之外膨胀一个菜单

Android Navigation View 以编程方式设置菜单

Android:创建 UI 组件并以编程方式重用它

Android:以编程方式检测设备是不是有硬件菜单按钮

Android以编程方式更改导航抽屉菜单项文本