片段式菜单

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

Activity1onCreateOptionsMenu(..) 中需要 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()

中动态更新菜单