将菜单添加到活动支持片段中的工具栏



我有一个Activity,我将其设置为supportActionBarToolbar。从这个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本身中膨胀菜单,否则我会收到空指针异常。这让我觉得我不是在劫持ActivitysupportActionBarFragment的控制权,而是试图为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它应该可以正常工作。

最新更新