web-dev-qa-db-fra.com

Masquer/Afficher le menu d'options de la barre d'action pour différents fragments

J'ai une activité Sherlock Fragment dans laquelle il y a 3 fragments.

Le fragment A, le fragment B, le fragment C sont trois fragments. Je souhaite afficher un menu d’option terminé uniquement dans le fragment B.

Et l'activité commence avec le fragment A. Lorsque le fragment B est sélectionné, le bouton est ajouté.

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

Quand je recommence le fragment A, je veux les options du menu DONE (défini sur le fragment B) pour cela, je le fais comme ceci

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

Mais cela ne cache pas du tout, cela donne aussi NullPointerException quand Activity est démarré avec le fragment A.

S'il vous plaît laissez-moi savoir quel est le problème.

50
Gaurav Arora

C'est une façon de faire ceci:

ajoutez un "groupe" à votre 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>

ensuite, ajoutez un 

Menu menu;

variable à votre activité et définissez-la dans votre remplacement de onCreateOptionsMenu:

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

Ensuite, ajoutez et utilisez cette fonction à votre activité lorsque vous souhaitez afficher/masquer le menu:

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

Je ne dis pas que c'est la meilleure/unique façon, mais cela fonctionne bien pour moi.

64
C0D3LIC1OU5

Essaye ça...

Il n'est pas nécessaire de redéfinir onCreateOptionsMenu () dans votre classe Fragment. La visibilité des éléments de menu peut être modifiée en remplaçant la méthode onPrepareOptionsMenu () disponible dans la classe Fragment.

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

Pour afficher les éléments d'action (boutons d'action) dans la barre d'actions des fragments où ils ne sont nécessaires, procédez comme suit:

Supposons que vous souhaitiez que le bouton save ne s'affiche que dans le fragment où vous acceptez les entrées et non dans le fragment où vous affichez une liste d'éléments. Ajoutez ceci à la méthode OnCreateOptionsMenu du fragment où vous affichez les éléments:

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    if (menu != null) {

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

REMARQUE: Pour que cela fonctionne, vous avez besoin de la méthode onCreate() dans votre fragment (où vous souhaitez masquer le bouton d'élément, le fragment de vue d'élément dans notre exemple) et ajoutez setHasOptionsMenu(true) comme ceci:

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

Ce n'est peut-être pas la meilleure option, mais cela fonctionne et c'est simple.

20

Cela fonctionnera à coup sûr, je suppose ...

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

Vous pouvez aussi vous référer à link pour plus de détails, c’est très utile.

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

Pour plus de références, voir: http://androiddhina.blogspot.in/2015/05/Android-how-to-hide-menu-item-in.html

5
Dhina k

Essaye ça

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

Vous pouvez créer un menu pour chaque fragment et une variable globale qui indique quel fragment est utilisé maintenant . Et vérifiez la valeur de la variable dans onCreateOptionsMenu et gonflez le bon menu.

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

En définissant la visibilité de tous les éléments du menu, le menu de la barre d’application ou du menu de débordement sera masqué automatiquement

Exemple

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

Avant de passer à un autre fragment, utilisez le code ci-dessous:

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

Bonjour, j’ai la meilleure solution, supposons si vous devez masquer un élément particulier lors de la création de la méthode Menu et l’afficher dans un autre fragment. Je prends un exemple de deux éléments de menu, l'un est modifier et l'autre est supprimer. Par exemple, menu xml est comme indiqué ci-dessous:

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

Remplacez maintenant les deux méthodes de votre activité et créez une variable de champ mMenu de la manière suivante:

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

Faites deux méthodes suivantes dans votre activité et appelez-les à partir de fragment pour masquer et afficher votre élément de menu. Ces méthodes sont les suivantes:

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

C'est résoudre de mon côté, je pense que cette explication va vous aider.

0
Sandeep Sankla

Même si la question est ancienne et a répondu. Il existe une réponse plus simple à cette question que celle mentionnée ci-dessus. Vous n'avez pas besoin d'utiliser d'autres variables .. Vous pouvez créer les boutons sur la barre d'actions, quel que soit le fragment que vous voulez, au lieu de créer des éléments de visibilité (afficher/masquer).

Ajoutez ce qui suit dans le fragment si vous avez besoin de l’élément de menu.

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

Exemple de fichier 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>

La gestion des événements onclick est comme d'habitude.

0
Suresh

Tard à la fête mais les réponses ci-dessus ne semblent pas fonctionner pour moi. 

Mon premier fragment d'onglet (utilise getChildFragmentManager () pour les onglets internes) contient le menu permettant d'afficher une icône de recherche et utilise Android.support.v7.widget.SearchView pour effectuer une recherche dans le fragment d'onglet interne, mais en naviguant vers d'autres onglets (qui ont également des onglets internes L'utilisation de getChildFragmentManager ()) ne supprime pas l'icône de recherche (car elle n'est pas obligatoire) et reste donc accessible sans fonction. Peut-être que j'utilise l'élément ci-dessous (c'est-à-dire les onglets principaux externes avec chaque onglet interne)

getChildFragmentManager(); 

Cependant, j'utilise ce qui suit dans mes fragments contenant/en utilisant getChildFragmentManager () pour les onglets internes.

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

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

    //access setHasOptionsMenu()
    setHasOptionsMenu(true);

    }
    //endregion onCreate

puis effacez l'élément de menu dans onPrepareOptionsMenu pour les fragments (icône de recherche et fonctions)

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

    }

Fonctionne bien et retourne à l'onglet/onglet interne avec les fonctions de l'icône de recherche et affiche l'icône de recherche et les fonctions.

J'espère que cela t'aides...

0
BENN1TH