如何强制onPrepareOptionsMenu方法触发?

时间:2012-09-13 12:03:53

标签: java android android-menu

在我的活动的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

3 个答案:

答案 0 :(得分:19)

正如斯莫克指出的那样:打电话给invalidateOptionsMenu()

答案 1 :(得分:3)

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

我有一个标志变量,我以这种方式在onCreateOptionsMenu(菜单菜单)方法中检查:

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

这是关于此主题的Official documentation

问候,加布里埃尔。

答案 2 :(得分: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;
}