MenuItem的findViewById返回null

时间:2013-05-11 18:28:55

标签: android android-actionbar actionbarsherlock

这是我的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建议的各种选项,但是它们没有解决我的问题。

5 个答案:

答案 0 :(得分:40)

而不是

favButton = (MenuItem) this.findViewById(R.id.fav_button);  
在getMenuInflater()。inflate(R.menu.activity_main,menu)之后的onCreateOptionsMenu中

;

favButton = menu.findItem(R.id.fav_button);

答案 1 :(得分:2)

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

此外,要在评论中回答您的问题,您可以使用onPrepareOptionsMenu来设置菜单的状态。如果此菜单是一次更新,您也可以使用onCreateOptionsMenu,只调用一次。

答案 2 :(得分: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;
}

答案 3 :(得分:0)

尝试

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

对我有用。

答案 4 :(得分:0)

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