在我的活动的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
。
答案 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;
}