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
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