Barra de herramientas de Android que no llama a onOptionsItemSelected de fragmentos en Backstack
Comencé recientemente a actualizar mi aplicación para utilizar el nuevo componente de la barra de herramientas introducido en Android 5.0 a favor de utilizar una vista personalizada sobre la barra de acción. He seguido la guía aquí: http://antonioleiva.com/material-design-everywhere/ y agregar la barra de herramientas funciona bien. El problema es que estoy usando una estructura de navegación donde tengo una MainActivity y reemplazo el contenido añadiendo Fragments a la backstack. Estoy reemplazando los métodos onCreateOptionsMenu y onOptionsItemSelected en mis Fragmentos para establecer los elementos del menú en la barra de herramientas, y los iconos cambian apropiadamente cuando cambia Fragments y onOptionsItemSelected se llama en el primer Fragmento, pero no se llama cuando agrego un Fragmento al pila posterior. La función onOptionsItemSelected en MainActivity ni siquiera se llama, por lo que el evento no se está consumiendo en la actividad. También he intentado reemplazar el Fragmento sin añadirlo al backstack, pero onOptionsItemSelected todavía no se llama. ¿Qué me falta para obtener onOptionsItemSelected para ser llamado una vez que cambiar el fragmento de contenido? El código relevante se publica a continuación.
Tema de la aplicación:
- Barra de herramientas android popupTheme vs theme
- La barra de herramientas de la ocultación de AppBarLayout se oculta
- ¿Barra de herramientas Android con dos líneas en el título?
- El efecto de ondulación de fondo en los elementos de la barra de herramientas de StandAlone se ha ido
- Cuándo establecer una barra de herramientas como una barra de acción cuando se utiliza AppCompat v21?
<style name="AppThemeLight" parent="@style/Theme.AppCompat.Light"> <item name="actionMenuTextColor">@color/white</item> <item name="android:windowDisablePreview">true</item> <item name="android:windowNoTitle">true</item> <item name="android:windowActionBarOverlay">true</item> <item name="android:windowActionBar">false</item> </style>
Adición de la barra de herramientas en MainActivity:
Toolbar toolbar = (Toolbar)findViewById( R.id.toolbar ); if (toolbar != null) { setSupportActionBar( toolbar ); getSupportActionBar().setDisplayHomeAsUpEnabled( true ); toolbar.setNavigationIcon( R.drawable.toolbar_icon_menu ); }
Funciones de menú en MainActivity:
@Override public boolean onCreateOptionsMenu( Menu menu ) { Log.v( "Main", "onCreateOptionsMenu" ); return super.onCreateOptionsMenu( menu ); } @Override public boolean onOptionsItemSelected( MenuItem item ) { Log.v( "Main", "onOptionsItemSelected" ); return super.onOptionsItemSelected( item ); }
Fragmento de nivel superior Funciones del menú:
@Override public void onCreateOptionsMenu( Menu menu, MenuInflater inflater ) { super.onCreateOptionsMenu( menu, inflater ); inflater.inflate( R.menu.main_looks, menu ); } @Override public boolean onOptionsItemSelected( MenuItem item ) { switch (item.getItemId()) { case R.id.miOptions: onOptions(); return true; default: return super.onOptionsItemSelected( item ); } }
Funciones del menú en Fragmento en backstack
@Override public void onCreateOptionsMenu( Menu menu, MenuInflater inflater ) { super.onCreateOptionsMenu( menu, inflater ); inflater.inflate( R.menu.user, menu ); } @Override public boolean onOptionsItemSelected( MenuItem item ) { Log.v( "User", "onOptionsItemSelected" ); switch (item.getItemId()) { case R.id.miUserShare: onShareUser(); return true; case R.id.miUserEdit: onEditUserProfile(); return true; default: return super.onOptionsItemSelected( item ); } }
- Barra de herramientas: IllegalStateException - configura tu compilación para VectorDrawableCompat
- ¿Cómo cambiar el contenido de la barra de herramientas mediante programación?
- Android lollipop toolbar conmutador entre abrir / cerrar el cajón y el botón Atrás
- Cómo cambiar los iconos de los iconos del menú de navegación y desbordamiento de la barra de herramientas (appcompat v7)?
- El reproductor de video apaga el modo en Android usando appcompat-v7
- Imagen de la barra de herramientas centrada
- CollapsingToolbarLayout setTitle () no se actualiza a menos que se colapse
- Mostrar flecha hacia atrás en la barra de herramientas Android
Resuelto el problema por casualidad mientras hacía cambios a otros fragmentos y notar que onOptionsItemSelected se llamaba de Fragmentos con diseños más simples. Resulta que por alguna razón tener un ScrollView como el componente de nivel superior para la distribución de un fragmento interfiere con la barra de herramientas recibiendo eventos táctiles. Envolviendo el ScrollView en un RelativeLayout adicional (cualquier diseño del contenedor probablemente funcionaría) onOptionsItemSelected puede ser llamado. Supongo que tiene algo que ver con el hecho de que el componente de barra de herramientas es ahora parte de la jerarquía de vista – no se puede pensar en por qué añadir un envoltorio para el ScrollView arreglaría el problema. Si alguien pudiera ayudar a explicar este comportamiento extraño, sería apreciado.
No se olvide de llamar a setHasOptionsMenu (true) en el OnCreate de su fragmento
- Inicie el navegador predeterminado con los parámetros de intención y publicación
- ¿Tiene diferentes dependencias en las ediciones de grado?