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"
/>
fuente
menu.clear()
enonCreateOptionsMenu
- lo contrario va a heredar el menú de los padres, también.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);
fuente
actionBarToolbar.setOnMenuItemClickListener()
para manejar acciones de elementos de menú.onOptionsItemSelected()
no se llama en esta situación.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); } }
fuente
onCreateOptionsMenu
Mé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); }
fuente
setTitle()
puede agregar títulos.La opción más sencilla es hacer
toolbar.inflateMenu(R.menu.fragment_menu);
fuente
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); }
fuente
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.
fuente
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) }
fuente
Dentro de XML agregue esta línea
app:menu="@menu/main_menu"
fuente
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 }
fuente