Ocultar / Mostrar Elemento de menú de Opciones de la Barra de Acciones para diferentes fragmentos


Tengo una Actividad de Fragmento de Sherlock en la que hay 3 Fragmentos.

El fragmento A, el Fragmento B, el Fragmento C son tres fragmentos. Quiero mostrar un menú de opciones hecho solo en el fragmento B.

Y la actividad se inicia con el Fragmento A. Cuando se selecciona el fragmento B se agrega el botón hecho.

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

Cuando vuelvo a iniciar el Fragmento A quiero hacer el menú de opciones (que se estableció en el Fragmento B) para esto estoy haciendo así

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

Pero esto no se esconde en absoluto, también está dando NullPointerException cuando la actividad se inicia por primera vez con el fragmento A.

Por favor, hágame saber cuál es el problema.

Author: Marko, 2014-04-20

11 answers

Esta es una manera de hacer esto:

Añade un "grupo" a tu menú:

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

A continuación, añadir un

Menu menu;

Variable a tu actividad y establécela en tu override de onCreateOptionsMenu:

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

Después, agregue y use esta función a su actividad cuando desee mostrar / ocultar el menú:

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

No estoy diciendo que esta sea la mejor/única manera, pero funciona bien para mí.

 58
Author: C0D3LIC1OU5,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-24 09:35:32

Prueba esto...

No necesitas sobrescribir onCreateOptionsMenu() en tu clase Fragment de nuevo. La visibilidad de los elementos del menú se puede cambiar sobrescribiendo el método onPrepareOptionsMenu () disponible en la clase 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);
}
 87
Author: Silambarasan Poonguti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-01 12:31:22

Para mostrar elementos de acción (botones de acción) en la barra de acción de fragmentos donde solo son necesarios, haga esto:

Digamos que desea que el botón save solo se muestre en el fragmento donde acepta la entrada de elementos y no en el Fragmento donde ve una lista de elementos, agregue esto al método OnCreateOptionsMenu del Fragmento donde ve los elementos:

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    if (menu != null) {

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

NOTA: Para que esto funcione, necesita el método onCreate() en su fragmento (donde desea ocultar el botón elemento, la vista elemento fragmento en nuestro ejemplo) y añadir setHasOptionsMenu(true) así:

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

Puede que no sea la mejor opción, pero funciona y es simple.

 20
Author: ojonugwa ochalifu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-31 10:46:48

Esto funcionará con seguridad, supongo...

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

También puede consultar este enlace para más detalles, es muy útil.

 6
Author: Pravinsingh Waghela,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-16 12:01:22
MenuItem Import = menu.findItem(R.id.Import);
  Import.setVisible(false)

Para más referencias, ver: http://androiddhina.blogspot.in/2015/05/android-how-to-hide-menu-item-in.html

 5
Author: Dhina k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-27 05:05:02

Prueba esto

@Override
public boolean onCreateOptionsMenu(Menu menu){
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.custom_actionbar, menu);
    menu.setGroupVisible(...);
}
 3
Author: Petrovich Denis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-20 12:21:31

Puede crear un menú para cada fragmento, y una variable global que marque qué fragmento está en uso ahora. y comprobar el valor de la variable en onCreateOptionsMenu e inflar el menú correcto

 @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         if (fragment_it == 6) {
             MenuInflater inflater = getMenuInflater();
             inflater.inflate(R.menu.custom_actionbar, menu);
         }
     } 
 1
Author: Ibraheem Saoud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-12 19:26:16

Aunque la pregunta es vieja y respondida. Hay una respuesta más simple a eso que la mencionada anteriormente. No es necesario utilizar ninguna otra variable. Puede crear los botones en la barra de acciones sea cual sea el fragmento que desee, en lugar de hacer las cosas de visibilidad(mostrar/ocultar).

Agregue lo siguiente en el fragmento lo que necesite el elemento de menú.

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

Menú de ejemplo.archivo 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>

El manejo de eventos onclick es como de costumbre.

 0
Author: Suresh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-23 02:38:18

Hola tengo la mejor solución de esto, supongamos que si u tiene que ocultar un elemento en particular en el método de menú crear y mostrar ese elemento en otro fragmento. Estoy tomando un ejemplo de dos elemento de menú uno es editar y otro es eliminar. e. g menú xml es como se da a continuación:

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

Ahora Sobrescribe el método two en tu actividad y crea una variable de campo mMenu como:

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

Haga dos métodos siguientes en su Actividad y llámelos desde fragment para ocultar y mostrar tu elemento del menú. Estos métodos son como:

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

Eso es Resolver por mi parte,creo que esta explicación te ayudará.

 0
Author: Sandeep Sankla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-07 12:21:40

Llegó tarde a la fiesta, pero las respuestas anteriores no parecían funcionar para mí.

Mi primer fragmento de pestaña (usa getChildFragmentManager() para pestañas internas) tiene el menú para mostrar un icono de búsqueda y usa android.apoyo.v7.widget.SearchView para buscar dentro del fragmento de la pestaña interna, pero navegar a otras pestañas (que también tienen pestañas internas utilizando getChildFragmentManager()) no eliminaría el icono de búsqueda (como no es necesario) y, por lo tanto, todavía accesible sin ninguna función, tal vez ya que estoy usando el siguiente (es decir, las pestañas principales externas con cada pestaña interna)

getChildFragmentManager(); 

Sin embargo utilizo lo siguiente en mis fragmentos conteniendo/usando getChildFragmentManager() para pestañas internas.

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

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

    //access setHasOptionsMenu()
    setHasOptionsMenu(true);

    }
    //endregion onCreate

Y luego borra el elemento de menú dentro de onPrepareOptionsMenu para fragmentos (icono de búsqueda y funciones)

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

    }

Funciona bien y navegar de vuelta a la pestaña/pestaña interna con el icono de búsqueda funciones re muestra el icono de búsqueda y funciones.

Espero que esto ayude...

 0
Author: BENN1TH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-21 04:29:38

Al configurar la visibilidad de todos los elementos en el menú, el menú appbar o el menú de desbordamiento se ocultarán automáticamente

Ejemplo

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

Antes de ir a otro fragmento, use el siguiente código:

if(menu_change_language != null){                 
 menu_change_language.findItem(R.id.menu_change_language)
  .setVisible(false);
}
 0
Author: Hantash Nadeem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-26 08:04:59