2017-01-09 103 views

回答

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是奇怪的,因爲它是一個「Opened」事件處理程序,而不是「Opening」事件處理程序。 – Hong