【问题标题】:Toolbar Menu showing in wrong fragment工具栏菜单显示在错误的片段中
【发布时间】:2017-09-03 05:20:23
【问题描述】:

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

https://imgur.com/ws9BRWR

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

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

Child-Menu-1 和 Child-Menu-2 应该在子片段的菜单中

这就是我所做的:

片段父级:

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

片段子:

@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. 调用子 onCreateOptionsMenu

  4. 调用父级 onCreateOptionsMenu

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

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

非常感谢您!

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

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

片段父级:

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

片段子:

@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?

我在这里碰壁了:(

【问题讨论】:

  • 我找到了答案,看看下面的解释

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


【解决方案1】:

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

【讨论】:

  • 你好,谢谢你的建议,你能说的更具体点吗?我应该在哪里放置invalidateOptionMenu()?我从布局创建了片段,所以它不是动态添加/替换的。我已经尝试 put getActivity().invalidateOptionsMenu();在onViewCreated或onCreateOptionsMenu,但结果还是一样
【解决方案2】:

我从这个链接找到了答案:
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;
        } 
    });
    

谢谢@skadoosh。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多