2017-01-09 11 views
4

Androidアプリは、次のコードを持っている:3ドットオーバーフローメニューボタンがクリックされるとAppCompatActivity.onMenuOpened(int featureId、メニューメニュー)のメニューがnullなのはなぜですか?

public class FooActivity extends AppCompatActivity{ 
    @Override 
    public boolean onMenuOpened(int featureId, Menu menu) { 
    } 
} 

、メニューが正常に表示されており、このMenuOpenedは(FEATUREID、メニューメニューをint型)と呼ばれるが、メニューがあるさをヌル。これは正常ですか?

答えて

4

メニューアイコンをクリックすると、onMenuOpenedが2回呼び出されます:最初にすぐに、次にメニューが準備されます。それが準備されていないので、明らかに初めてNULLです。したがって、このコールバックのメニューにアクセスする場合は、nullをチェックし、そうでない場合は実行してください。

簡単な実験:メニューアイコンをクリック

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.activity_main_toolbar); 
     setSupportActionBar(toolbar); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     menu.add("first"); 
     menu.add("second"); 
     return super.onCreateOptionsMenu(menu); 
    } 

    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     Log.d("tag", "onPrepareOptionsMenu called"); 
     return super.onPrepareOptionsMenu(menu); 
    } 

    @Override 
    public boolean onMenuOpened(int featureId, Menu menu) { 
     Log.d("tag", "onMenuOpened called"); 
     if(menu!=null) { 
      Log.d("tag", "menu is ready"); 
     } else { 
      Log.d("tag", "menu is null yet"); 
     } 
     return super.onMenuOpened(featureId, menu); 
    } 
} 

出力:

D/tag: onMenuOpened called 
D/tag: menu is null yet 
D/tag: onPrepareOptionsMenu called 
D/tag: onMenuOpened called 
D/tag: menu is ready 
+2

おかげ徹底解明のためにたくさん。 onMenuOpenedは、 "Opening"イベントハンドラではなく、 "Opened"イベントハンドラを考慮して準備される前に呼び出されるのは不思議です。 – Hong

関連する問題