工具栏菜单显示在错误的片段中
Toolbar Menu showing in wrong fragment
我的 main_activity 有 2 个片段 -> Parent 和 Child 如下:
每个片段都应该有自己的操作栏和菜单。
我的问题是:为什么应该在 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);
}
我已经尝试过的:
将 getSupportActionBar 移动到 onViewCreated <--- 结果相同
将 inflate 移动到 onPrepareOptionsMenu <--- 结果相同
我注意到如果我从 parent 片段中删除菜单,child 上的菜单会正确显示,只有当我尝试用它们自己的菜单加载每个菜单时才会出现问题。
当我调试应用程序时,调用的序列是:
调用 child 片段 onCreateView
调用 parent 片段 onCreateView
调用 child onCreateOptionsMenu
调用 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);
}
结果:
所有菜单项都显示在 child 片段中,为什么 parent 片段 onCreateOptionMenu 在没有声明工具栏的情况下被调用?
我在这里撞墙:(
您是否尝试过在添加或替换 Fragment
后调用 invalidateOptionsMenu()
?
我从这个link中找到了答案:
如果我们 运行 1 个 activity 内的多个工具栏菜单(即使在我的例子中是不同的片段)
第一个toolbar,inflate来自onCreateOptionsMenu(),回调来自onOptionsItemSelected()
对于第二个工具栏,通过我们需要膨胀第二个菜单工具栏并手动设置回调:
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。
我的 main_activity 有 2 个片段 -> Parent 和 Child 如下:
每个片段都应该有自己的操作栏和菜单。
我的问题是:为什么应该在 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);
}
我已经尝试过的:
将 getSupportActionBar 移动到 onViewCreated <--- 结果相同
将 inflate 移动到 onPrepareOptionsMenu <--- 结果相同
我注意到如果我从 parent 片段中删除菜单,child 上的菜单会正确显示,只有当我尝试用它们自己的菜单加载每个菜单时才会出现问题。
当我调试应用程序时,调用的序列是:
调用 child 片段 onCreateView
调用 parent 片段 onCreateView
调用 child onCreateOptionsMenu
调用 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);
}
结果:
所有菜单项都显示在 child 片段中,为什么 parent 片段 onCreateOptionMenu 在没有声明工具栏的情况下被调用?
我在这里撞墙:(
您是否尝试过在添加或替换 Fragment
后调用 invalidateOptionsMenu()
?
我从这个link中找到了答案:
如果我们 运行 1 个 activity 内的多个工具栏菜单(即使在我的例子中是不同的片段)
第一个toolbar,inflate来自onCreateOptionsMenu(),回调来自onOptionsItemSelected()
对于第二个工具栏,通过我们需要膨胀第二个菜单工具栏并手动设置回调:
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。