我的main_activity有2个片段 - >父母与子女如下:
每个片段都应该有自己的操作栏和自己的菜单。
我的问题是:为什么假定在子片段中显示的菜单混合在一起形成父片段?
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< ---同样的结果
我注意到,如果我从父片段中删除菜单,则子项上的菜单会正确显示,只有当我尝试使用自己的菜单加载每个菜单时才会出现问题。
当我调试应用程序时,调用的序列是:
调用子片段onCreateView
调用父片段onCreateView
调用child onCreateOptionsMenu
调用parent onCreateOptionsMenu
所以我怀疑问题发生在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);
}
结果:
所有菜单项都显示在子片段中,为什么在没有声明工具栏的情况下调用父片段onCreateOptionMenu?
我在这里撞墙:(答案 0 :(得分:1)
您是否在添加或替换invalidateOptionsMenu()
后尝试拨打Fragment
?
答案 1 :(得分:0)
我从这个链接找到答案:
Set menus for multiple toolbars on android
如果我们在1个活动中运行多个工具栏菜单(即使在我的情况下在不同的片段中)
,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。