27

这是我的 ActionBar 菜单的 xml 文件。

<?xml version="1.0" encoding="utf-8"?>

<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
            android:id="@+id/fav_button"
            android:title="Favourite"
            android:icon="@drawable/unstar"
            android:showAsAction="always|withText" />
</menu>

在我的onCreate函数中调用setContentView. 我做favButton = (MenuItem) this.findViewById(R.id.fav_button);但是这返回null。

但在onOptionsItemSelected函数上返回正确的对象。

我正在使用 ActionBarSherlock,如果这会有所作为。

我尝试了其他 findViewById 建议的各种选项返回空问题,但它们并没有解决我的问题。

4

5 回答 5

50

代替

favButton = (MenuItem) this.findViewById(R.id.fav_button);  

在 getMenuInflater().inflate(R.menu.activity_main, menu) 之后的 onCreateOptionsMenu;

favButton = menu.findItem(R.id.fav_button);
于 2013-05-11T18:52:00.500 回答
3

使用 menu.findItem() 获取菜单。但这需要在菜单膨胀后完成。

此外,要在评论中回答您的 q,您可以使用 onPrepareOptionsMenu 设置菜单的状态。如果这个菜单是一次性更新的,你也可以使用 onCreateOptionsMenu,它只被调用一次。

于 2015-05-20T17:35:22.757 回答
1

但是如果有人真的需要View而不是MenuItem(对于不同的操作,例如开始动画),您仍然可以通过以下方式获得它:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.your_menu_xml_file, menu);
    ...
    new Handler().post(new Runnable() {
        @Override
        public void run() {
            view = findViewById(R.id.menu_refresh_button);
            // view.startAnimation(animation);
        }
    });
    return true;
}
于 2018-03-24T17:20:36.213 回答
0

尝试

        final Toolbar toolbar = findViewById(R.id.toolbar);
        Menu menu=toolbar.getMenu();
        MenuItem item = menu.findItem(R.id.'name id item');

对我有用。

于 2020-03-11T16:04:29.853 回答
0

我不知道为什么,但就我而言,我使用findViewById(R.id.menu_id)return null。但我发现我使用findViewById(item.getItemId)in onOptionsItemSelected,它返回我们想要的视图。

于 2021-08-11T10:38:56.737 回答