简体   繁体   English

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

[英]Hide/Show Action Bar Option Menu Item for different fragments

I have a Sherlock Fragment Activity in which there are 3 Fragments.我有一个 Sherlock 片段活动,其中有 3 个片段。

Fragment A, Fragment B, Fragment C are three fragments.片段A、片段B、片段C是三个片段。 I want to show a done option menu in Fragment B only.我只想在片段 B 中显示完成的选项菜单。

And the activity is started with Fragment A. When Fragment B is selected done button is added.并且活动以片段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);
}

When I again start Fragment AI want to options Menu DONE (which was set at Fragment B) for this I am doing like this当我再次启动 Fragment AI 时,我想为此选择 Menu DONE(在 Fragment B 中设置),我正在这样做

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

But this is not hiding at all, also it is giving NullPointerException when Activity if first started with Fragment A.但这根本没有隐藏,如果 Activity 首次从 Fragment A 开始,它也会给出 NullPointerException。

Please let me know what is the problem.请让我知道是什么问题。

Try this...试试这个...

You don't need to override onCreateOptionsMenu() in your Fragment class again.您不需要再次覆盖 Fragment 类中的 onCreateOptionsMenu() 。 Menu items visibility can be changed by overriding onPrepareOptionsMenu() method available in Fragment class.可以通过覆盖 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);
}

This is one way of doing this:这是这样做的一种方法:

add a "group" to your menu:在菜单中添加一个“组”:

<?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>

then, add a然后,添加一个

Menu menu;

variable to your activity and set it in your override of onCreateOptionsMenu:变量到您的活动并将其设置在您的 onCreateOptionsMenu 覆盖中:

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

After, add and use this function to your activity when you'd like to show/hide the menu:之后,当您想显示/隐藏菜单时,将此功能添加到您的活动中并使用:

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

I am not saying this is the best/only way, but it works well for me.我并不是说这是最好的/唯一的方法,但它对我来说效果很好。

To show action items (action buttons) in the ActionBar of fragments where they are only needed, do this:要在片段的 ActionBar 中仅需要它们的地方显示操作项(操作按钮),请执行以下操作:

Lets say you want the save button to only show in the fragment where you accept input for items and not in the Fragment where you view a list of items, add this to the OnCreateOptionsMenu method of the Fragment where you view the items:假设您希望save按钮仅显示在您接受项目输入的片段中,而不是显示在您查看项目列表的片段中,请将其添加到您查看项目的片段的OnCreateOptionsMenu方法中:

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    if (menu != null) {

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

NOTE: For this to work, you need the onCreate() method in your Fragment (where you want to hide item button, the item view fragment in our example) and add setHasOptionsMenu(true) like this:注意:为此,您需要在 Fragment 中使用onCreate()方法(您要隐藏项目按钮的位置,在我们的示例中为项目视图片段)并添加setHasOptionsMenu(true)如下所示:

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

Might not be the best option, but it works and it's simple.可能不是最好的选择,但它有效而且很简单。

This will work for sure I guess...我猜这肯定会起作用...

// 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

You can also refer this link for more details, it is a very useful one.您也可以参考此 链接以获取更多详细信息,这是一个非常有用的 链接

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

Try this试试这个

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

By setting the Visibility of all items in Menu, the appbar menu or overflow menu will be Hide automatically通过设置Menu中所有项目的Visibility,appbar菜单或溢出菜单将被自动隐藏

Example例子

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

Before going to other fragment use bellow code:在转到其他片段之前,请使用以下代码:

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

You can make a menu for each fragment, and a global variable that mark which fragment is in use now.您可以为每个片段制作一个菜单,以及一个标记当前正在使用哪个片段的全局变量。 and check the value of the variable in onCreateOptionsMenu and inflate the correct menu并检查 onCreateOptionsMenu 中变量的值并扩充正确的菜单

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

Hello I got the best solution of this, suppose if u have to hide a particular item at on create Menu method and show that item in other fragment.您好,我得到了最好的解决方案,假设您必须在创建菜单方法中隐藏特定项目并在其他片段中显示该项目。 I am taking an example of two menu item one is edit and other is delete.我以两个菜单项为例,一个是编辑,另一个是删除。 eg menu xml is as given below:例如,菜单 xml 如下所示:

sell_menu.xml销售菜单.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" />

Now Override the two method in your activity & make a field variable mMenu as:现在在您的活动中覆盖这两个方法并将字段变量 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);
 }

Make two following method in your Activity & call them from fragment to hide and show your menu item.在您的 Activity 中创建以下两个方法并从片段中调用它们以隐藏和显示您的菜单项。 These method are as:这些方法如下:

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

That's Solve from my side,I think this explanation will help you.这是我这边的解决方案,我认为这个解释会对你有所帮助。

Even though the question is old and answered.即使这个问题很老而且得到了回答。 There is a simpler answer to that than the above mentioned.有一个比上面提到的更简单的答案。 You don't need to use any other variables.您不需要使用任何其他变量。 You can create the buttons on action bar whatever the fragment you want, instead of doing the visibility stuff(show/hide).您可以在操作栏上创建您想要的任何片段的按钮,而不是执行可见性内容(显示/隐藏)。

Add the following in the fragment whatever u need the menu item.无论您需要菜单项,都在片段中添加以下内容。

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

Sample menu.xml file:示例 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>

Handling onclick events is as usual.处理 onclick 事件与往常一样。

Late to the party but the answers above didn't seem to work for me.聚会迟到了,但上面的答案似乎对我不起作用。

My first tab fragment (uses getChildFragmentManager() for inner tabs) has the menu to show a search icon and uses android.support.v7.widget.SearchView to search within the inner tab fragment but navigating to other tabs (which also have inner tabs using getChildFragmentManager()) would not remove the search icon (as not required) and therefore still accessible with no function, maybe as I am using the below (ie outer main tabs with each inner tabs)我的第一个选项卡片段(使用 getChildFragmentManager() 作为内部选项卡)具有显示搜索图标的菜单,并使用 android.support.v7.widget.SearchView 在内部选项卡片段中搜索但导航到其他选项卡(也有内部选项卡)使用 getChildFragmentManager()) 不会删除搜索图标(因为不是必需的),因此仍然可以在没有功能的情况下访问,也许我正在使用下面的(即带有每个内部选项卡的外部主选项卡)

getChildFragmentManager(); 

However I use the below in my fragments containing/using the getChildFragmentManager() for inner tabs.但是,我在包含/使用内部选项卡的 getChildFragmentManager() 的片段中使用以下内容。

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

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

    //access setHasOptionsMenu()
    setHasOptionsMenu(true);

    }
    //endregion onCreate

and then clear the menu item inside onPrepareOptionsMenu for fragments(search icon & functions)然后清除 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();

    }

Works well and navigating back to the tab/inner tab with the search icon functions re displays the search icon & functions.效果很好,导航回带有搜索图标功能的选项卡/内部选项卡会重新显示搜索图标和功能。

Hope this helps...希望这可以帮助...

Okay I spend couple of hour to get this solution.apparently you can get menuitem from your toolbar to anywhere in activity or fragment.好的,我花了几个小时来获得这个解决方案。显然,您可以将菜单项从工具栏中获取到活动或片段中的任何位置。 So in my case.所以在我的情况下。

var menuItem = toolbar.menu;   

Now to get specfic item from menu item现在从菜单项中获取特定项

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

Note: favIcon is MenuItem declare global注意:favIcon 是 MenuItem 声明全局
Now if you can do whatever you want to do for this icon现在如果你可以为这个图标做任何你想做的事
eg.例如。 to make it invisible使其不可见

favIcon?.isVisible=false

For some reason the method was not working for me this is how I solved it according to the accepted solution由于某种原因,该方法对我不起作用,这就是我根据公认的解决方案解决它的方法

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM