为什么 AppCompatActivity.onMenuOpened(int featureId, Menu menu) 的菜单为空?

Why is menu of AppCompatActivity.onMenuOpened(int featureId, Menu menu) null?

Android 应用具有以下代码:

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

点击三点溢出菜单按钮时,菜单正常显示,调用了这个MenuOpened(int featureId, Menu menu),但是menu为null。这正常吗?

当您单击菜单图标时 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