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:

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

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

  • Cómo crear las pestañas de la barra de herramientas con ViewPager en el diseño del material
  • Establecer la altura de la barra de herramientas mediante programación Android
  • Cambiar el color del icono de desbordamiento de la barra de herramientas
  • Superposiciones ListView con ToolBar
  • Título del centro de Android con el cajón de navegación
  • Android: Cómo eliminar la línea entre la barra de herramientas y la barra de estado
  • Creación de una barra de herramientas personalizada en android
  • Cambiar el color de la barra de herramientas en Appcompat 21
  • CoordinatorLayout: Ocultando / Mostrando barra de herramientas medio visible?
  • Mostrar barra de herramientas después de oculto por desplazamiento en el botón de clic
  • Cómo eliminar subrayado blanco en un widget de SearchView en la barra de herramientas Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.