工具栏菜单显示在错误的片段中

Toolbar Menu showing in wrong fragment

我的 main_activity 有 2 个片段 -> Parent 和 Child 如下:

https://imgur.com/ws9BRWR

每个片段都应该有自己的操作栏和菜单。

我的问题是:为什么应该在 child 片段中显示的菜单混合到 parent 片段中?

Child-Menu-1 和 Child-Menu-2 应该在 child 片段

的菜单内

这就是我所做的:

片段Parent :

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.activity_parent, container, false);
    setHasOptionsMenu(true);

    Toolbar myToolbar = (Toolbar) view.findViewById(R.id.tb_parent);
    ((AppCompatActivity)getActivity()).setSupportActionBar(myToolbar);
    ((AppCompatActivity)getActivity()).getSupportActionBar().setTitle("PARENT");
    //((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayShowTitleEnabled(false);

    return view;
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.menu_parent, menu);
}

片段Child :

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.activity_child, container, false);
    setHasOptionsMenu(true);

    Toolbar myToolbar = (Toolbar) view.findViewById(R.id.tb_child);
    ((AppCompatActivity)getActivity()).setSupportActionBar(myToolbar);
    ((AppCompatActivity)getActivity()).getSupportActionBar().setTitle("CHILD");
    //((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayShowTitleEnabled(false);

    return view;
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.menu_child, menu);
}

我已经尝试过的:

我注意到如果我从 parent 片段中删除菜单,child 上的菜单会正确显示,只有当我尝试用它们自己的菜单加载每个菜单时才会出现问题。

当我调试应用程序时,调用的序列是:

  1. 调用 child 片段 onCreateView

  2. 调用 parent 片段 onCreateView

  3. 调用 child onCreateOptionsMenu

  4. 调用 parent onCreateOptionsMenu

所以我怀疑问题出在 onCreateOptionMenu 中,其中充气器充气了错误的片段。

我已经在 SO 和 google 中进行了大量搜索,但似乎没有问题与我的情况相似。

非常感谢您!!

============================================= =============================

进一步检查和测试...所以我从 parent 片段中注释掉了工具栏的创建:

片段Parent :

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.activity_parent, container, false);
    setHasOptionsMenu(true);

    //Toolbar myToolbar = (Toolbar) view.findViewById(R.id.tb_parent);
    //((AppCompatActivity)getActivity()).setSupportActionBar(myToolbar);
    //((AppCompatActivity)getActivity()).getSupportActionBar().setTitle("PARENT");
    //((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayShowTitleEnabled(false);

    return view;
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.menu_parent, menu);
}

片段Child :

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.activity_child, container, false);
    setHasOptionsMenu(true);

    Toolbar myToolbar = (Toolbar) view.findViewById(R.id.tb_child);
    ((AppCompatActivity)getActivity()).setSupportActionBar(myToolbar);
    ((AppCompatActivity)getActivity()).getSupportActionBar().setTitle("CHILD");
    //((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayShowTitleEnabled(false);

    return view;
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.menu_child, menu);
}

结果:

https://imgur.com/wYVdsvH

所有菜单项都显示在 child 片段中,为什么 parent 片段 onCreateOptionMenu 在没有声明工具栏的情况下被调用?

我在这里撞墙:(

您是否尝试过在添加或替换 Fragment 后调用 invalidateOptionsMenu()

我从这个link中找到了答案:

如果我们 运行 1 个 activity 内的多个工具栏菜单(即使在我的例子中是不同的片段)

  1. 第一个toolbar,inflate来自onCreateOptionsMenu(),回调来自onOptionsItemSelected()

  2. 对于第二个工具栏,通过我们需要膨胀第二个菜单工具栏并手动设置回调:

    toolbar2 = (Toolbar) findViewById(R.id.tool_bar_bottom);
    toolbar2.inflateMenu(R.menu.bottom_menu);//changed
    toolbar2.setOnMenuItemClickListener(new OnMenuItemClickListener() {
    
        @Override
        public boolean onMenuItemClick(MenuItem arg0) {
            if(arg0.getItemId() == R.id.item_id){
    
            }
            return false;
        } 
    });
    

谢谢@skadoosh。