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

时间:2017-09-03 05:20:24

标签: android android-fragments android-actionbar android-toolbar android-menu

我的main_activity有2个片段 - >父母与子女如下:

https://imgur.com/ws9BRWR

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

我的问题是:为什么假定在子片段中显示的菜单混合在一起形成父片段?

Child-Menu-1和Child-Menu-2应该是子片段内的菜单

这就是我所做的:

fragmentParent:

@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);
}

fragmentChild:

@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);
}

我已经尝试过了:

  • 将getSupportActionBar移动到onViewCreated< ---相同的结果

  • 将inflate移至onPrepareOptionsMenu< ---同样的结果

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

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

  1. 调用子片段onCreateView

  2. 调用父片段onCreateView

  3. 调用child onCreateOptionsMenu

  4. 调用parent onCreateOptionsMenu

  5. 所以我怀疑问题发生在onCreateOptionMenu中,其中inflater会膨胀错误的片段。

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

    提前非常感谢!!

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

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

    fragmentParent:

    @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);
    }
    

    fragmentChild:

    @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

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

    我在这里撞墙:(

2 个答案:

答案 0 :(得分:1)

您是否在添加或替换invalidateOptionsMenu()后尝试拨打Fragment

答案 1 :(得分:0)

我从这个链接找到答案:
Set menus for multiple toolbars on android

如果我们在1个活动中运行多个工具栏菜单(即使在我的情况下在不同的片段中)

    对于第一个工具栏,
  1. ,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;
        } 
    });
    
  3. 谢谢@skadoosh。