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

Gau*_*ora 55 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);
}
Run Code Online (Sandbox Code Playgroud)

当我再次启动Fragment AI想要选项菜单DONE(在片段B中设置)为此我就是这样做的

setHasOptionsMenu(false);
MenuItem item = (MenuItem) menu.findItem(R.id.done_item);
item.setVisible(false);
Run Code Online (Sandbox Code Playgroud)

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

请告诉我这是什么问题.

Sil*_*uti 94

试试这个...

您不需要再次覆盖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);
}
Run Code Online (Sandbox Code Playgroud)


C0D*_*OU5 71

这是这样做的一种方式:

在菜单中添加"组":

<?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>
Run Code Online (Sandbox Code Playgroud)

然后,添加一个

Menu menu;
Run Code Online (Sandbox Code Playgroud)

变量到您的活动并在您的onCreateOptionsMenu覆盖中设置它:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    this.menu = menu;
    // inflate your menu here
}
Run Code Online (Sandbox Code Playgroud)

之后,当您要显示/隐藏菜单时,将此功能添加到您的活动中:

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

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

  • 我认为这是一个很好的解决方案!它简单而干净. (2认同)

ojo*_*ifu 20

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

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

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    if (menu != null) {

        menu.findItem(R.id.action_save_item).setVisible(false);
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:要使其工作,您需要onCreate()片段中的方法(您要隐藏项目按钮,我们示例中的项目视图片段)并添加setHasOptionsMenu(true)如下:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}
Run Code Online (Sandbox Code Playgroud)

可能不是最好的选择,但它的工作原理很简单.


Pra*_*ela 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
Run Code Online (Sandbox Code Playgroud)

您也可以参考此链接了解更多详情,这是一个非常有用的链接.


Dhi*_*a k 5

MenuItem Import = menu.findItem(R.id.Import);
  Import.setVisible(false)
Run Code Online (Sandbox Code Playgroud)

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