我有一个Activity
,我将其设置为supportActionBar
Toolbar
。从这个Activity
我有各种Fragments
,每个都有定制的ActionBar
。我可以调用menu.clear()
来删除现有的Menu
但是我无法在同一Fragment
中添加另一个Menu
。这似乎很奇怪,因为menu.clear()
的行为与我所期望的一样,但是当调用inflater.inflate(R.menu.my_custom_menu,menu);
时,似乎什么也没做。
我希望修改supportActionBar
的示例片段:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
actionBar = ((AppCompatActivity)getActivity()).getSupportActionBar();
mGroupViewModel =
ViewModelProviders.of(requireActivity()).get(GroupsViewModel.class);
}
...
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
//Inflating seems to do nothing.
Log.i(TAG,"IN THE ONCREATEOPTIONSMENU FOR FRAGMENT.");
inflater.inflate(R.menu.group_edit_toolbar,menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
Log.i(TAG,"ONPREPARE OPTIONS MENU IN FRAGMENT.");
menu.clear();
super.onPrepareOptionsMenu(menu);
}
显然,有些事情我不明白,但我无法缩小问题的范围。
更好的方法是让每个Fragment
都有自己的Toolbar
而不是我所有的片段修改托管活动的supportActionBar
?
更新经过进一步测试,我注意到如果我尝试在我的Fragment
中分配本地MenuItem
,除非我首先在Fragment
本身中膨胀菜单,否则我会收到空指针异常。这让我觉得我不是在劫持Activity
supportActionBar
在Fragment
的控制权,而是试图为Fragment
创建一个单独的ActionBar
。有人能在这里补充我的想法吗?
Fragment
的菜单回调:
MenuItem editItem;
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
Log.i(TAG,"IN ONCREATEOPTIONS");
menu.clear();
//MUST INFLATE MENU OTHERWISE WE GET NULL ERROR.
inflater.inflate(R.menu.home_actionbar,menu);
editItem = menu.findItem(R.id.action_edit_group);
Log.i(TAG,"edititem: "+editItem.getItemId());
super.onCreateOptionsMenu(menu, inflater);
}
// This is called every time the Menu opens.
@Override
public void onPrepareOptionsMenu(Menu menu) {
Log.i(TAG,"IN THE on prepare FOR FRAGMENT.");
menu.findItem(R.id.action_create_group).setVisible(false);
menu.findItem(R.id.action_create_group).setEnabled(false);
if(owner.equals(currUser)){
menu.findItem(R.id.action_edit_group).setEnabled(true);
menu.findItem(R.id.action_edit_group).setVisible(true);
} else {
menu.findItem(R.id.action_edit_group).setVisible(false);
menu.findItem(R.id.action_edit_group).setEnabled(false);
}
super.onPrepareOptionsMenu(menu);
}
onPrepareOptionsMenu
总是在onCreateOptionsMenu
之后调用,并且您正在删除最近膨胀的菜单!
只需删除onPrepareOptionsMenu
它应该可以正常工作。