[英]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.