2017-01-09 4 views

Antwort

4

Wenn Sie auf das Menüsymbol onMenuOpened klicken, wird zweimal aufgerufen: das erste Mal sofort, dann wenn das Menü vorbereitet ist. Offensichtlich ist es zum ersten Mal null, weil es nicht vorbereitet ist. Wenn Sie also in diesem Callback auf das Menü zugreifen möchten, prüfen Sie es einfach auf Null und tun Sie es, wenn es nicht funktioniert.

einfaches Experiment:

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); 
    } 
} 

Ausgabe, wenn Menüsymbol geklickt:

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

Vielen Dank für die gründliche Aufklärung. Es ist seltsam, dass onMenuOpened aufgerufen wird, bevor es vorbereitet wird, da es sich um einen Event-Handler "Opened" und nicht um den Event-Handler "Opening" handelt. – Hong