繁体   English   中英

获取工具栏中的MenuItem的ID

[英]Get the ID of a MenuItem in a toolbar

我有一个带有以下代码的“菜单”资源“ menu_test”:

<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".TestActivity" >

<item android:id="@+id/hideshow"
    android:title="Body visbility"
    android:orderInCategory="100"
    android:icon="@drawable/showicon"
    app:showAsAction="always" />

</menu>

在我的activity.java文件中,将“ onCreate”函数中的工具栏膨胀,并添加一个点击侦听器:

private Toolbar toolbar;
...
toolbar = (Toolbar)findViewById(R.id.toolbarId);
toolbar.inflateMenu(R.menu.menu_test);
toolbar.setOnMenuItemClickListener(this);

我想获取“ hideshow”的ID并更改图标:

testItem = (MenuItem) toolbar.findViewById(R.id.hideshow);
testItem.setIcon(R.drawable.hideicon);

但是在第一行获取ID时,应用崩溃。 在点击侦听器功能中,它可以正常运行,因为ID是随点击内部提供的:

public boolean onMenuItemClick(MenuItem item)
    item.setIcon(R.drawable.hideicon);

那么,如何更改onCreate函数中的图标? (“ findItem”不起作用,因为工具栏不是菜单)

我可能会更容易以编程方式添加菜单项,因此您可以维护对它们的引用:

public class MainActivity extends AppCompatActivity {

    private static final int MENU_SETTINGS = Menu.FIRST;
    MenuItem menuItem;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        menuItem = menu.add(0, MENU_SETTINGS, 0, R.string.action_settings).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case MENU_SETTINGS:
                // DO SOMETHING
                break;
        }
        return super.onOptionsItemSelected(item);
    }

}

正如其他答案和注释所指出的那样,需要从onCreateOptionsMenu或onPrepareOptionsMenu中进行引用。

就我而言,这将需要大量代码重写,因为这是一个旧项目,其中所有内容都基于使用工具栏而不是菜单。

但是,我找到了一个简单的解决方案:我没有找到ID并更改图标,而是创建了具有不同图标的menu_test [1 .. n] .xml的多个实例,并仅使用inflateMenu(R.menu.menu_test [1 .. n ]),具体取决于我需要的图标。

如果您编写新代码,请使用Abtin Gramian的解决方案,因此我将其标记为正确的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM