从片段将菜单添加到活动支持工具栏
Posted
技术标签:
【中文标题】从片段将菜单添加到活动支持工具栏【英文标题】:Add Menu to Activity's supportToolBar from a Fragment 【发布时间】: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);
【问题讨论】:
【参考方案1】:onPrepareOptionsMenu
总是在onCreateOptionsMenu
之后被调用,你正在删除你最近膨胀的菜单!
只需删除onPrepareOptionsMenu
,它应该可以正常工作。
【讨论】:
嗨,是的。即使在注释掉onPrepareOptionsMenu
回调后,同样的问题仍然存在。看来我也只能在onPrepareOptionsMenu
内正确执行menu.clear()
。我希望如果我可以在这里清除menu
,那么我也可以添加一个。有什么想法吗?以上是关于从片段将菜单添加到活动支持工具栏的主要内容,如果未能解决你的问题,请参考以下文章