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

5
一个Android应用程序有以下代码:
public class FooActivity extends AppCompatActivity{
   @Override
    public boolean onMenuOpened(int featureId, Menu menu) {
    }
}

当点击三点溢出菜单按钮时,菜单通常会显示,并调用此MenuOpened(int featureId, Menu menu)方法,但是menu为空。这正常吗?

1个回答

8
当您点击菜单图标时,onMenuOpened会被调用两次:第一次是立即调用,然后当菜单准备好后再次调用。很显然,第一次它为null,因为它没有准备好。所以如果您想在此回调中访问菜单-只需检查它是否为null,并在其不为null时执行操作。
简单实验:
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
看起来这取决于targetSDKVersion。在较新的SDK版本(例如30),它只被调用一次,而不需要“menu == null”。 - Fisher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接