web-dev-qa-db-ja.com

MenuItemのfindViewByIdがnullを返す

これは、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関数では、after呼び出しsetContentViewです。私はfavButton = (MenuItem) this.findViewById(R.id.fav_button);を行いますが、これはnullを返します。

しかし、onOptionsItemSelected関数で適切なオブジェクトを返します。

それが違いを生むのであれば、私はActionBarSherlockを使用しています。

他のfindViewByIdがnullの質問を返すことで提案されたさまざまなオプションを試しましたが、それらは私の問題を解決していません。

24
yasith

の代わりに

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

getMenuInflater()。inflate(R.menu.activity_main、menu);の後のonCreateOptionsMenu内。

favButton = menu.findItem(R.id.fav_button);
43
Hoan Nguyen

メニューを取得するには、menu.findItem()を使用します。しかし、これはメニューが膨らんだ後に行う必要があります。

また、コメントでqに回答するには、onPrepareOptionsMenuを使用してメニューの状態を設定できます。このメニューが1回限りの更新の場合、onCreateOptionsMenuも使用できます。これは1回だけ呼び出されます。

2
onusopus

しかし、誰かが本当に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;
}
1
user25

試す

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

私のために働く。

0
Paolo