【发布时间】:2019-07-18 09:25:37
【问题描述】:
我有一个Activity 和一个Toolbar,我将其设置为supportActionBar。从这个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);
}
【问题讨论】:
标签: android android-fragments android-actionbar android-toolbar android-menu