9

在我的活动onCreateOptionsMenu方法中,我只是扩充我的菜单布局文件并附加它。

我想根据全局变量的值 a 显示/隐藏一些菜单项,我在onPrepareOptionsMenu方法中执行此操作。我读过这是正确的地方。

我的onPrepareOptionsMenu方法并不总是触发。我不知道为什么,但当我按下手机上的“菜单”按钮时,它并不总是触发。也许它与它的内部状态有关。

它似乎在创建 Acitvity 时触发。第一次按“菜单”按钮不会触发它,但如果我第二次按菜单按钮,它就可以正常工作。

有没有办法可以强制onPrepareOptionsMenu开火。

谢谢


Smok 建议使用该invalidateOptionsMenu方法使菜单项无效,但这onCreateOptionsMenu也会导致该方法被触发。这是我的方法:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    System.out.println("onCreate");

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.search, menu);

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setIconified(false);
    searchView.requestFocusFromTouch();

    return true;

}

@Override
public boolean onPrepareOptionsMenu (Menu menu) {
    System.out.println("prepared");

    if (this.objAdapter == null) {
        menu.findItem(R.id.sort).setVisible(false);
        menu.findItem(R.id.filter).setVisible(false);
        menu.findItem(R.id.group).setVisible(false);
    } else {
        menu.findItem(R.id.sort).setVisible(true);
        menu.findItem(R.id.filter).setVisible(true);
        menu.findItem(R.id.group).setVisible(true);

    }

    return true;
}

从我的onCreateOptionsMenu方法中可以看出,再次调用它会导致焦点丢失到SearchView.

4

3 回答 3

24

正如 Smok 指出的那样:通过调用invalidateOptionsMenu().

于 2012-09-13T12:48:14.573 回答
3

我遇到了同样的问题,我使用 supportInvalidateOptionsMenu() 方法进行了修复(因为我使用了支持活动)但有一个解决方法。

我有一个标志变量,我以这种方式检查 onCreateOptionsMenu(Menu menu) 方法:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (!IS_MENU_FIXED) {
        // Create menu only the first time the activity is loaded
        super.onCreateOptionsMenu(menu);
        getSupportMenuInflater().inflate(R.menu.main, menu);
        // Create menu items, etc...
    }
    return true;
}

这就是我在需要时调用 supportInvalidateOptionsMenu() 的方式:

if (!IS_MENU_FIXED) {
    supportInvalidateOptionsMenu();
    IS_MENU_FIXED = Boolean.TRUE;
}

这是关于这个主题的官方文档。

问候,加布里埃尔。

于 2014-04-24T00:41:34.347 回答
0

我在 navigationDrawer Activity 中使用这段代码,它嵌套了两个片段(FullCoinsFragment 和 NewsFragment):

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.navigation, menu);

    MenuItem item = menu.findItem(R.id.action_search); //i will remove it later
    SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
    searchView.setOnQueryTextListener(this);

    return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    FullCoinsFragment test = (FullCoinsFragment)getSupportFragmentManager().findFragmentByTag(FRAGMENT_COINS);
    if (test != null && test.isVisible()) return true; // i don't want to show this menu search in NewsFragment
    menu.removeItem(R.id.action_search); //i'm removing the search option
    return true;
}

在我的 NewsFragment 的 onCreate() 中,我有这个:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_news, container, false);

    //views initialization

    getActivity().invalidateOptionsMenu(); //i'm forcing the call to onCreateOptionsMenu() and onPrepareOptionsMenu

    return view;
}
于 2017-09-17T05:05:36.790 回答