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

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,那么我也可以添加一个。有什么想法吗?

以上是关于从片段将菜单添加到活动支持工具栏的主要内容,如果未能解决你的问题,请参考以下文章

工具栏 - 只有一个活动从抽屉切换到后退按钮

如何使用菜单按钮将数据从活动传递到android中的片段?

onDetach()不要求从一个片段移动到另一个片段

使用导航从工具栏菜单项单击在片段之间传递数据 - Kotlin

工具栏作为片段中的操作栏

如何从片段获取数据到另一个活动? (不是容器活动)[重复]