Barra de herramientas de Android Agregar elementos de menú para diferentes fragmentos

89

Tengo una barra de herramientas y un cajón de navegación. Cuando inicio mi aplicación, se crean la barra de herramientas y el cajón de navegación. Cuando hago clic en elementos en el cajón de navegación, se inician nuevos fragmentos y mantiene la misma barra de herramientas. ¿Cómo agrego básicamente elementos de menú a la barra de herramientas, como buscar, agregar, editar cuando comienzo fragmentos específicos? No los quiero al inicio del programa, sino creados dinámicamente. Además, ¿cómo podría hacer clic en estos botones y hacer que inicien otros fragmentos? Lo quiero para que en un fragmento, el botón editar en la barra de herramientas haga algo específico en comparación con el botón editar en otro fragmento. ¡Gracias!

Menu_toolbar:

<?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/edit"
    android:orderInCategory="1"
    android:title="Edit"
    app:showAsAction="always"
    android:icon="@drawable/pencil_icon"/>
<item android:id="@+id/add"
    android:orderInCategory="1"
    android:title="Add"
    app:showAsAction="always"
    android:icon="@drawable/plus_icon"/>

Barra de herramientas:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="55dp"
android:background="#10a1ff"
android:title="Home"
/>
Joe Eigi
fuente

Respuestas:

167

Agregue un código similar a sus fragmentos:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState)
{
    View v = inflater.inflate(R.layout.library_fragment, parent, false);
    setHasOptionsMenu(true);
    return v;
}


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

De esta forma, puede personalizar el menú de sus fragmentos.

Gundu Bandgar
fuente
19
Esta es la respuesta correcta porque la llamada a setHasOptionsMenu (true) es necesaria para el método onCreateOptionsMenu que se llama en el fragmento.
John Slavick
15
Recuerde en llamar menu.clear()en onCreateOptionsMenu- lo contrario va a heredar el menú de los padres, también.
Dart Dega
@DartDega ¿dónde pongo el código para borrar? Fragmento o actividad señor, no veo el elemento del
menú
¿Funciona esto con el nivel de API 28? Todavía veo los elementos del menú de actividades principales
ArdenDev
33

Así es como se crea un menú de forma dinámica: http://www.101apps.co.za/index.php/articles/using-toolbars-in-your-apps.html

Editado:

Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar);
setSupportActionBar(actionBarToolBar);
actionBarToolBar.setNavigationIcon(R.drawable.icon);
actionBarToolBar.setNavigationContextDescription(getResources().getString(R.string.desc);
actionBarToolBar.setLogo(R.drawable.other_icon);
actionBarToolBar.setLogoDescription(getResources().getString(R.string.other_desc);
actionBarToolBar.inflateMenu(R.menu.fragment_menu);
Allen Chan
fuente
4
utilizar actionBarToolbar.setOnMenuItemClickListener()para manejar acciones de elementos de menú. onOptionsItemSelected()no se llama en esta situación.
Lahiru Chandima
2
El enlace dado ya no existe
Ashvin solanki
25

La mejor forma de hacerlo:

1. Busque la barra de herramientas en Actividad y configúrela como supportActionBar.

Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar);
setSupportActionBar(actionBarToolBar);

2. Entonces será pan comido manejar menús de opciones para diferentes fragmentos en una misma actividad. Haga lo siguiente en cada fragmento como desee:

En la llamada al método OnCreateView

setHasOptionsMenu(true);

Y por último,

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

Y para administrar los elementos del menú, haga clic en onOptionsItemSelected:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_search :
            Log.i("item id ", item.getItemId() + "");
        default:
            return super.onOptionsItemSelected(item);
    }
}
Prateek Gupta
fuente
1
setHasOptionsMenu (true) es realmente útil. Thank U
J.Dragon
10

onCreateOptionsMenuMétodo de anulación en cada fragmento.

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.your_menu_xml, menu);
    super.onCreateOptionsMenu(menu, inflater);
}
Ellie Zou
fuente
@JoeEigi ¿Por qué quieres una barra de herramientas diferente? Puede establecer diferentes títulos y menús.
Ellie Zou
@JoeEigi sí, puede tener un menú personalizado inflando el menú personalizado xml. La llamada setTitle()puede agregar títulos.
Ellie Zou
@JoeEigi Parece que tiene el contexto equivocado, eche un vistazo a esto: stackoverflow.com/questions/26998455/…
Allen Chan
1
Apagué la barra de acción en mi manifiesto, pero todavía aparece en el diseño de mi actividad sobre la barra de herramientas. ¿Cómo me deshago de esto?
Joe Eigi
Sí, lo hice y todavía aparece en mi diseño, pero está fuera de la vista
Joe Eigi
4

Resolví estos problemas correctamente. Mi solución es el siguiente código:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    mRootView = inflater.inflate(R.layout.fragment_order_history, container, false);
    //getActivity().invalidateOptionsMenu();


    setHasOptionsMenu(true);

    return mRootView;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.main, menu);
    super.onCreateOptionsMenu(menu, inflater);
}
Hai Rom
fuente
Sí, mostré el menú correctamente. Pero cómo ocultar este menú al cerrar el fragmento, me refiero a cuando cambiamos a otro fragmento, por ejemplo, de a -> b, el menú de a aún visible en la barra de herramientas del fragmento b.
Zeeshan Ahmed
use setHasOptionsMenu (falso) en onCreateView del fragmento b.
Kannan_SJD
4

Tuve el mismo problema y quería reemplazar el menú de la barra de herramientas de acuerdo con el fragmento mostrado.

El problema al que me enfrento ahora es que el menú se agrega al anterior.

Para mostrar solo el menú del fragmento, sugiero:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
     menu.clear(); //Empty the old menu
     inflater.inflate(R.menu.menu_fragment1, menu);
     super.onCreateOptionsMenu(menu, inflater);
}

Espero que te ayude.

Matteo Gariglio
fuente
2
solo verifique si menu! = null antes de llamar a .clear ()
mapo
2

A continuación se muestran los pasos para mostrar diferentes opciones de menú con diferentes fragmentos.

Paso 1: llamar a setHasOptionsMenu (verdadero)

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        setHasOptionsMenu(true)
        super.onViewCreated(view, savedInstanceState)

    }

Paso 2: Infle los elementos del menú de opciones relacionados con el fragmento.

override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
    // To clear previously added menu items
    menu?.clear()
    inflater?.inflate(R.menu.your_fragment_menu, menu)
    super.onCreateOptionsMenu(menu, inflater)
}
takharsh
fuente
Esto me ayudó a eliminar el botón de menú no deseado que apareció en mi nuevo menú
Batman
1

Dentro de XML agregue esta línea

app:menu="@menu/main_menu"
AbdelraZek
fuente
1
¡De hecho tienes razón! Puede especificarlo por xml y luego en el fragmento: `` `anular la diversión onViewCreated (ver: Ver, SavedInstanceState: Bundle?) {Super.onViewCreated (view, SavedInstanceState) toolBar.setNavigationOnClickListener {activity? .OnBackPressed ()} searchView = toolBar.menu.findItem (R.id.action_search) .actionView como SearchView searchView.setOnQueryTextListener (this)} `` `
user3193413
0

Usando la nueva MaterialToolbar es muy fácil crear un menú adicional y usarlo para:

<com.google.android.material.appbar.MaterialToolbar
        android:id="@+id/toolbar"
        android:layout_width="0dp"
        android:layout_height="?attr/actionBarSize"
        app:navigationIcon="@drawable/ic_menu"
        app:menu="@menu/main_menu"/>

y luego en el código para configurar OnCLick Listeners simplemente agregue esto:

toolbar.setOnMenuItemClickListener {
            // .. DO SOMETHING HERE
            false
        }
Amin Keshavarzian
fuente