片段式菜单
Menu in fragments
我有这个场景:
我有一个activity,让我们用
称呼它Acitivty1
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return false;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return false;
}
我打开 Activity1
中的一个片段,我们将其命名为 Fragment1
:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setHasOptionsMenu(true);
View view = inflater.inflate(R.layout.layout, container, false);
return view;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
if (menu != null){
menu.clear();
}
if (!boolean) {
inflater.inflate(R.menu.menu1, menu);
} else {
inflater.inflate(R.menu.menu2, menu);
}
}
此片段将作为新实例从 activity 再次调用。
基于 onCreateOptionsMenu()
中的布尔值,我正在决定应该在片段中加载什么菜单,因此,在第二个实例中,如果我单击菜单项,我会看到第一个实例片段的对象。
我不知道,为什么会这样?
显示菜单选项的工作流程如何...
if (menu != null){
menu.clear();
}
那段代码可能是根本原因。
您是在告诉系统清除 menu
,如果它是 null
。好吧,仅供参考,menu
首先永远不会是 null
;它由系统提供。它可能里面没有任何物品,但它永远不会是 null
.
检查 menu
是否已经包含一个项目(或更多)的一种方法是调用 hasVisibleItems()
.
来自文档:
public abstract boolean hasVisibleItems()
Returns True if there is one or more item visible, else false.
因此,您应该这样做:
if (menu.hasVisibleItems()){
menu.clear();
}
您 Activity1
的 onCreateOptionsMenu(..)
中需要 inflate
菜单,并且需要 return true
才能显示菜单。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Your code here
getMenuInflater().inflate(R.menu.main1, menu);//My menu
return true;
}
之后你的片段中也会有菜单。
编辑:
如果您使用单个菜单文件和 show
/ hide
MenuItem
菜单。它会解决你的问题。
将所有菜单添加到单个 file.by 默认所有菜单项都可见 false 使用 android:visible="false"
查看示例代码:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
MenuItem item1 = menu.getItem(0);
MenuItem item2 = menu.getItem(1);
MenuItem item3 = menu.getItem(2);
MenuItem item4 = menu.getItem(3);
if(!boolean){
//visible items which you want to show when boolean is false
item1.setVisible(true);
item2.setVisible(true);
}
else
{
//visible items which you want to show when boolean is true
item3.setVisible(true);
item4.setVisible(true);
}
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.menuItem1) {
return true;
}
if (id == R.id.menuItem2) {
return true;
}
...
return super.onOptionsItemSelected(item);
}
在这种情况下,您需要将菜单放在activity中,并在onPrepareOptionsMenu()
中动态更新菜单
我有这个场景:
我有一个activity,让我们用
称呼它Acitivty1
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return false;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return false;
}
我打开 Activity1
中的一个片段,我们将其命名为 Fragment1
:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setHasOptionsMenu(true);
View view = inflater.inflate(R.layout.layout, container, false);
return view;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
if (menu != null){
menu.clear();
}
if (!boolean) {
inflater.inflate(R.menu.menu1, menu);
} else {
inflater.inflate(R.menu.menu2, menu);
}
}
此片段将作为新实例从 activity 再次调用。
基于 onCreateOptionsMenu()
中的布尔值,我正在决定应该在片段中加载什么菜单,因此,在第二个实例中,如果我单击菜单项,我会看到第一个实例片段的对象。
我不知道,为什么会这样?
显示菜单选项的工作流程如何...
if (menu != null){
menu.clear();
}
那段代码可能是根本原因。
您是在告诉系统清除 menu
,如果它是 null
。好吧,仅供参考,menu
首先永远不会是 null
;它由系统提供。它可能里面没有任何物品,但它永远不会是 null
.
检查 menu
是否已经包含一个项目(或更多)的一种方法是调用 hasVisibleItems()
.
来自文档:
public abstract boolean hasVisibleItems()
Returns True if there is one or more item visible, else false.
因此,您应该这样做:
if (menu.hasVisibleItems()){
menu.clear();
}
您 Activity1
的 onCreateOptionsMenu(..)
中需要 inflate
菜单,并且需要 return true
才能显示菜单。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Your code here
getMenuInflater().inflate(R.menu.main1, menu);//My menu
return true;
}
之后你的片段中也会有菜单。
编辑:
如果您使用单个菜单文件和 show
/ hide
MenuItem
菜单。它会解决你的问题。
将所有菜单添加到单个 file.by 默认所有菜单项都可见 false 使用 android:visible="false"
查看示例代码:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
MenuItem item1 = menu.getItem(0);
MenuItem item2 = menu.getItem(1);
MenuItem item3 = menu.getItem(2);
MenuItem item4 = menu.getItem(3);
if(!boolean){
//visible items which you want to show when boolean is false
item1.setVisible(true);
item2.setVisible(true);
}
else
{
//visible items which you want to show when boolean is true
item3.setVisible(true);
item4.setVisible(true);
}
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.menuItem1) {
return true;
}
if (id == R.id.menuItem2) {
return true;
}
...
return super.onOptionsItemSelected(item);
}
在这种情况下,您需要将菜单放在activity中,并在onPrepareOptionsMenu()