2017-01-09 13 views
4

Android приложение имеет следующий код:Почему меню AppCompatActivity.onMenuOpened (int featureId, меню меню) null?

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

Когда кнопку 3-точка меню переполнения щелкнуло, меню отображается нормально, и это MenuOpened (интермедиат FeatureId, меню Menu) называется, но меню ноль. Это нормально?

ответ

4

При нажатии значка меню onMenuOpened вызывается дважды: первый раз сразу, затем, когда меню готово. Очевидно, что первый раз он равен нулю, потому что он не подготовлен. Поэтому, если вы хотите получить доступ к меню в этом обратном вызове - просто проверьте его на нуль и делайте что-нибудь, если это не так.

Простой эксперимент:

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 вызывается до того, как он будет подготовлен, учитывая, что это обработчик события «Открытый», а не «Открытие» обработчика событий. – Hong