隐藏/显示不同片段的操作栏选项菜单项

时间:2014-04-20 05:08:24

标签: android actionbarsherlock android-fragmentactivity

我有一个Sherlock片段活动,其中有3个片段。

片段A,片段B,片段C是三个片段。我想仅在片段B中显示完成选项菜单。

活动以片段A开始。选择片段B时,会添加完成按钮。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    if(!menusInflated){
        inflater.inflate(R.menu.security, menu);
        menusInflated=true;
    }

    super.onCreateOptionsMenu(menu, inflater);
}

当我再次启动片段A时,我想选择菜单DONE(在片段B中设置)这样做我就是这样做

setHasOptionsMenu(false);
MenuItem item = (MenuItem) menu.findItem(R.id.done_item);
item.setVisible(false);

但是这根本没有隐藏,如果首次使用Fragment A启动Activity,它也会给出NullPointerException。

请告诉我这是什么问题。

13 个答案:

答案 0 :(得分:92)

试试这个......

您不需要再次覆盖Fragment类中的onCreateOptionsMenu()。可以通过覆盖Fragment类中提供的onPrepareOptionsMenu()方法来更改菜单项可见性。

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
    menu.findItem(R.id.action_search).setVisible(false);
    super.onPrepareOptionsMenu(menu);
}

答案 1 :(得分:65)

这是这样做的一种方式:

添加"组"到你的菜单:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <group
        android:id="@+id/main_menu_group">
         <item android:id="@+id/done_item"
              android:title="..."
              android:icon="..."
              android:showAsAction="..."/>
    </group>
</menu>

然后,添加一个

Menu menu;

您的活动的变量,并将其设置为onCreateOptionsMenu:

的覆盖
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    this.menu = menu;
    // inflate your menu here
}

当您要显示/隐藏菜单时,请在您的活动中添加并使用此功能:

public void showOverflowMenu(boolean showMenu){
    if(menu == null)
        return;
    menu.setGroupVisible(R.id.main_menu_group, showMenu);
}

我并不是说这是最好的/唯一的方式,但对我来说效果很好。

答案 2 :(得分:20)

要在仅需要它们的片段的ActionBar中显示操作项(操作按钮),请执行以下操作:

假设您希望save按钮仅显示在您接受项目输入的片段中,而不是在您查看项目列表的片段中,请将其添加到OnCreateOptionsMenu方法中您查看项目的片段:

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    if (menu != null) {

        menu.findItem(R.id.action_save_item).setVisible(false);
    }
}

注意:为此,您需要片段中的onCreate()方法(您要隐藏项目按钮,我们示例中的项目视图片段)并添加{{ 1}}像这样:

setHasOptionsMenu(true)

可能不是最佳选择,但它很有效,而且很简单。

答案 3 :(得分:6)

这肯定会起作用我猜...

// Declare
Menu menu;
MenuItem menuDoneItem;

// Then in your onCreateOptionMenu() method write the following...
@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        this.menu=menu;
        inflater.inflate(R.menu.secutity, menu);
            }

// In your onOptionItemSelected() method write the following...
@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.done_item:
                this.menuDoneItem=item;
                someOperation();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

// Now Making invisible any menu item...
public void menuInvisible(){
setHasOptionsMenu(true);// Take part in populating the action bar menu
            menuDoneItem=(MenuItem)menu.findItem(R.id.done_item);
                menuRefresh.setVisible(false); // make true to make the menu item visible.
}

//Use the above method whenever you need to make your menu item visible or invisiable

您也可以参考此link了解更多详情,这是非常有用的。

答案 4 :(得分:5)

MenuItem Import = menu.findItem(R.id.Import);
  Import.setVisible(false)

有关详情,请参阅:http://androiddhina.blogspot.in/2015/05/android-how-to-hide-menu-item-in.html

答案 5 :(得分:3)

试试这个

@Override
public boolean onCreateOptionsMenu(Menu menu){
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.custom_actionbar, menu);
    menu.setGroupVisible(...);
}

答案 6 :(得分:1)

您可以为每个片段创建一个菜单,以及一个标记当前正在使用哪个片段的全局变量。 并检查onCreateOptionsMenu中变量的值并膨胀正确的菜单

 @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         if (fragment_it == 6) {
             MenuInflater inflater = getMenuInflater();
             inflater.inflate(R.menu.custom_actionbar, menu);
         }
     } 

答案 7 :(得分:1)

通过设置菜单中所有项目的可见性,appbar菜单或溢出菜单将自动隐藏

实施例

 private Menu menu_change_language;
 ...
 ...
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
    ...
    ...
    menu_change_language = menu;
   menu_change_language.findItem(R.id.menu_change_language).setVisible(true);

    return super.onCreateOptionsMenu(menu);
}

在转到其他片段之前,请使用以下代码:

if(menu_change_language != null){                 
 menu_change_language.findItem(R.id.menu_change_language)
  .setVisible(false);
}

答案 8 :(得分:0)

尽管这个问题很老并且已经回答了。对此有一个比上面提到的更简单的答案。您不需要使用任何其他变量。 您可以在操作栏上创建所需片段的按钮,而不是执行可见性内容(显示/隐藏)。

在片段中添加以下内容,无论你需要什么菜单项。

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

示例menu.xml文件:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/action_addFlat"
        android:icon="@drawable/add"
        android:showAsAction="ifRoom|withText"
        android:title="@string/action_addFlat"/>
</menu>

处理onclick事件与往常一样。

答案 9 :(得分:0)

您好我得到了最好的解决方案,假设您必须在创建Menu方法中隐藏特定项目并在其他片段中显示该项目。我举两个菜单项目的例子是编辑,其他是删除。例如,菜单xml如下所示:

sell_menu.xml

 <?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto">

<item
    android:id="@+id/action_edit"
    android:icon="@drawable/ic_edit_white_shadow_24dp"
    app:showAsAction="always"
    android:title="Edit" />

<item
    android:id="@+id/action_delete"
    android:icon="@drawable/ic_delete_white_shadow_24dp"
    app:showAsAction="always"
    android:title="Delete" />

现在覆盖您活动中的两种方法&amp;将字段变量mMenu设为:

  private Menu mMenu;         //  field variable    


  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.sell_menu, menu);
    this.mMenu = menu;

    menu.findItem(R.id.action_delete).setVisible(false);
    return super.onCreateOptionsMenu(menu);
  }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.action_delete) {
       // do action
        return true;
    } else if (item.getItemId() == R.id.action_edit) {
      // do action
        return true;
    }

    return super.onOptionsItemSelected(item);
 }

在您的活动&amp;中制作以下两种方法从片段中调用它们来隐藏并显示您的菜单项。这些方法如下:

public void showDeleteImageOption(boolean status) {
    if (menu != null) {
        menu.findItem(R.id.action_delete).setVisible(status);
    }
}

public void showEditImageOption(boolean status) {
    if (menu != null) {
        menu.findItem(R.id.action_edit).setVisible(status);
    }
}

从我这里解决,我认为这个解释会对你有帮助。

答案 10 :(得分:0)

晚会,但上面的答案对我来说似乎没有用。

我的第一个标签片段(使用内部标签的getChildFragmentManager())具有显示搜索图标的菜单,并使用android.support.v7.widget.SearchView在内部标签片段内搜索,但导航到其他标签(也是有内部选项卡使用getChildFragmentManager())不会删除搜索图标(因为不需要),因此仍然可以访问没有任何功能,也许因为我使用下面(即每个内部选项卡的外部主选项卡)

getChildFragmentManager(); 

但是我在包含/使用getChildFragmentManager()的片段中使用下面的内部标签。

    //region onCreate
    @Override
    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setRetainInstance(true);

    //access setHasOptionsMenu()
    setHasOptionsMenu(true);

    }
    //endregion onCreate

然后清除onPrepareOptionsMenu里面的菜单项片段(搜索图标和功能)

    @Override
    public void onPrepareOptionsMenu(Menu menu) {

    super.onPrepareOptionsMenu(menu);

    //clear the menu/hide the icon & disable the search access/function ...
    //this will clear the menu entirely, so rewrite/draw the menu items after if needed
    menu.clear();

    }

运行良好并使用搜索图标功能导航回标签/内部标签,重新显示搜索图标&amp;功能

希望这会有所帮助......

答案 11 :(得分:0)

好的,我花了几个小时来获得这个解决方案。显然,您可以将菜单项从工具栏中获取到活动或片段中的任何位置。所以就我而言。

var menuItem = toolbar.menu;   

现在从菜单项中获取特定项

favIcon = menuItem.findItem(R.id.favourite);      

注意:favIcon 是 MenuItem 声明全局
现在如果你可以为这个图标做任何你想做的事情
例如。让它不可见

favIcon?.isVisible=false

答案 12 :(得分:0)

由于某种原因,该方法对我不起作用,这就是我根据已接受的解决方案解决它的方法

//This should be in on create
new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                showOverflowMenu(false);
            }
        },100);


@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        this.menu = menu;
        getMenuInflater().inflate(R.menu.options_menu, menu);
        return true;
    }



public void showOverflowMenu(boolean showMenu){
        if(menu == null)
            return;
        menu.setGroupVisible(R.id.grp, showMenu);
    }