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

问题描述 投票:0回答:1

我有一个ActivityToolbar,我设置为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本身膨胀一个菜单。这让我觉得我并没有劫持ActivitysupportActionBar中对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);
}
android android-fragments android-actionbar android-toolbar android-menu
1个回答
0
投票

onPrepareOptionsMenu总是在onCreateOptionsMenu之后调用,你在那里删除你最近夸大的菜单! 只需删除onPrepareOptionsMenu,它应该工作正常。

© www.soinside.com 2019 - 2024. All rights reserved.