如何根据id获取菜单项

24

我在res/menu/student_marks.xml文件中有我的menuItem:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".StudentMarks" >
    <item android:id="@+id/action_selected_year"
        android:title="@string/action_selected_year"
        android:showAsAction="withText|ifRoom"
        style="@style/AppTheme" />
</menu>

现在我需要为这个项目设置一个标题,在我的应用程序的特定部分。

我可以使用以下方法来处理这个特定的项目:

onOptionsItemSelected(MenuItem item)

问题在于我需要在程序的另一个部分中获取项目“action_selected_year”,但不是在该方法中。
我不知道如何获得它。
3个回答

45
Menu optionsMenu;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
   getMenuInflater().inflate(R.menu.main, menu);
   //  store the menu to var when creating options menu
   optionsMenu = menu;
}

而要获取菜单项:

MenuItem item = optionsMenu.findItem(R.id. action_selected_year);

4
您也可以直接从工具栏检索菜单(如果这是一个布局中的工具栏): 确保您的工具栏在布局中具有ID,并通过KTX或ViewBinding检索它。假设我们正在使用ViewBinding,代码如下: "viewBinding.my_toolbar_id.menu.findItem(id_of_my_menu_item)" 无需存储任何变量。 - A.Mamode
视图绑定与工具栏不兼容。 - Ray Chakrit

11
Menu optionsMenu;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
       getMenuInflater().inflate(R.menu.main, menu);
       //  store the menu to var when creating options menu
       optionsMenu = menu;
    }

示例:更改第一个menuItem上的图标(optionsMenu应不为null)

optionsMenu.getItem(0).setIcon(getResources()
    .getDrawable(R.drawable.ic_action_green));

1
完美,将菜单的引用保存在activity变量中,允许我对菜单对象进行完美的控制。谢谢。 - Giovanni Far
13
这并不能通过ID获取菜单项目,它只会返回第一个菜单项目。 - Johann
9
可以调用findItem()方法并传入你要查找的id,而不是调用getItem(0)方法。 - ali-hk

3

如果您的菜单在NavigationView内 示例:

<com.google.android.material.navigation.NavigationView 
    android:id="@+id/navigationView"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    app:menu="@menu/menu_layout" />

然后,您可以通过以下方式按ID查找您的菜单项:
NavigationView navigationView = findViewById(R.id.navigationView);
Menu menu = navigationView.getMenu();
MenuItem menuItem = menu.findItem(R.id.your_menu_item_id);

这似乎是另一个答案的副本,有被投票降低风险。为了避免这种情况,请解释其不同之处或将其删除。 - bartonstanley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接