android - programacion - Ocultar/Mostrar elemento de menú de opción de la barra de acción para diferentes fragmentos
mostrar barra de herramientas en netbeans (11)
Tengo una Actividad de Fragmento de Sherlock en la que hay 3 Fragmentos.
Fragmento A, Fragmento B, Fragmento C son tres fragmentos. Quiero mostrar un menú de opción hecho en el Fragmento B solamente.
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 empiezo de nuevo el Fragmento AI quiero las opciones Menú HECHO (que se estableció en el Fragmento B) para esto estoy haciendo esto
setHasOptionsMenu(false);
MenuItem item = (MenuItem) menu.findItem(R.id.done_item);
item.setVisible(false);
Pero esto no se oculta en absoluto, también está dando NullPointerException cuando Actividad si primero comenzó con el Fragmento A.
Por favor, hágame saber cuál es el problema.
Al configurar la Visibilidad de todos los elementos en el Menú, el menú de la barra de la aplicación 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);
}
Aunque la pregunta es vieja y respondida. Hay una respuesta más simple a eso que lo mencionado anteriormente. No necesita usar 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 sea lo que sea que necesite el elemento del menú.
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu, menu);
super.onCreateOptionsMenu(menu, inflater);
}
Muestra del archivo 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>
Manejar eventos onclick es como de costumbre.
Esta es una forma de hacer esto:
agrega 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>
luego, agrega un
Menu menu;
variable a su actividad y configurarlo en su reemplazo 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 u 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í.
Esto funcionará seguro, 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 link para obtener más detalles, es muy útil.
Hola, tengo la mejor solución para esto, supongamos que si tiene que ocultar un elemento en particular en el método Crear menú y muestra ese elemento en otro fragmento. Estoy tomando un ejemplo de dos elementos del menú uno es editar y otro es eliminar. por ejemplo, el menú xml es el siguiente:
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 anule los dos métodos en su actividad y establezca 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 el fragmento para ocultar y mostrar su elemento de 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 de mi lado, creo que esta explicación te ayudará.
Para mostrar los elementos de acción (botones de acción) en la barra de acciones de los fragmentos donde solo son necesarios, haga esto:
Supongamos que quiere que el botón save
solo se muestre en el fragmento donde acepta entradas para los elementos y no en el Fragmento donde ve una lista de elementos, agréguelo 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 de elemento, el fragmento de vista de elemento en nuestro ejemplo) y agregue setHasOptionsMenu(true)
esta manera:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
Puede que no sea la mejor opción, pero funciona y es simple.
Prueba esto
@Override
public boolean onCreateOptionsMenu(Menu menu){
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.custom_actionbar, menu);
menu.setGroupVisible(...);
}
Prueba esto...
No necesita reemplazar OverCreateOptionsMenu () en su clase Fragment nuevamente. La visibilidad de los elementos del menú se puede cambiar anulando 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);
}
Puede crear un menú para cada fragmento y una variable global que marque qué fragmento está en uso ahora. y verifique el valor de la variable en onCreateOptionsMenu e infle el menú correcto
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (fragment_it == 6) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.custom_actionbar, menu);
}
}
Tarde para la fiesta, pero las respuestas anteriores no parecían funcionar para mí.
Mi primer fragmento de pestaña (usa getChildFragmentManager () para las pestañas internas) tiene el menú para mostrar un ícono de búsqueda y usa android.support.v7.widget.SearchView para buscar dentro del fragmento de pestañas interno pero navegando a otras pestañas (que también tienen pestañas internas) el uso de getChildFragmentManager ()) no eliminaría el ícono de búsqueda (ya que no es obligatorio) y, por lo tanto, se puede acceder sin ninguna función, tal vez porque estoy usando lo siguiente (es decir, pestañas externas principales con cada pestañas internas)
getChildFragmentManager();
Sin embargo, utilizo el siguiente en mis fragmentos que contienen / usando getChildFragmentManager () para las pestañas internas.
//region onCreate
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
//access setHasOptionsMenu()
setHasOptionsMenu(true);
}
//endregion onCreate
y luego borre el elemento del menú dentro 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 al volver a la pestaña / pestaña interna con las funciones del icono de búsqueda se muestra el ícono y las funciones de búsqueda.
Espero que esto ayude...
MenuItem Import = menu.findItem(R.id.Import);
Import.setVisible(false)
Para obtener más información, consulte: http://androiddhina.blogspot.in/2015/05/android-how-to-hide-menu-item-in.html