我有一个Activity
与Toolbar
,我设置为supportActionBar
。从这个Activity
我有各种Fragments
每个与定制的ActionBar
。我可以打电话给menu.clear()
去除现有的Menu
但是我无法在同一个Menu
中添加另一个Fragment
。这看起来很奇怪,因为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
?
更新在进一步测试之后,我注意到如果我尝试在我的MenuItem
中分配一个本地Fragment
,我会收到一个空指针异常,除非我首先在Fragment
本身膨胀一个菜单。这让我觉得我并没有劫持Activity
在supportActionBar
中对Fragment
的控制,而是试图为ActionBar
创建一个单独的Fragment
。有人能在这里补充我的想法吗?
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
,它应该工作正常。