PDA

Ver la Versión Completa : Toolbar, DrawerLayout, Menú vacío y onBackPressed


kriogeN
16/09/15, 12:04:33
Es la primera vez que creo un post en esta sección, normalmente lo que hago es responderlos :risitas:

Voy a explicar un problema que me ha pasado esta mañana, y que no se si es cosa de mi móvil o pasará con todos

Aunque no lo indique, todo lo que explico a continuación es usando AppCompat, aunque el móvil es Lollipop.

Normalmente nunca uso Toolbar, suelo poner el botón de menú a la izquierda, un menú en el centro y un SearchView a la derecha, todo a mano. Pero estoy haciendo una aplicación nueva para una empresa que quieren cosas muy visuales, así que me he puesto con el Toolbar para poder añadir el ActionBarDrawerToggle (el botón de menú que se convierte en una flecla y viceversa según el % que esté abierto el DrawerLayout).

Pues bien, hago mi Toolbar, le quito el Title, le pongo un logo, le añado el DrawerLayout y su configuración, le añado el SearchView mediante un menú de la siguiente manera:


<item
android:id="@+id/search"
android:title="@string/buscar"
android:icon="@android:drawable/ic_menu_search"
myapp:showAsAction="always"
myapp:actionViewClass="android.support.v7.widget.SearchView"/>


Añado mi código para que funcione de esta otra:


getMenuInflater().inflate(R.menu.menu_principal, menu);
return true;


Y todo funciona perfecto, pero en estas que pulso el botón de menú del móvil (tengo un S5, el botón de menú en una pulsación larga en el botón que muestra las apps abiertas) y al pulsar atrás el método onBackPressed() no se ejecuta. Le pongo puntos de interrupción y nada. Si no pulso menú todo funciona perfecto, pero si lo pulso bloqueada, no puedes salir. Si abro el DrawerLayout y pulso atrás se cierra, pero el onBackPressed no se ejecuta.

En estás que cambio el "always" del SearchView a "never", la lupa no sale, pero al pulsar menú aparece el texto "Buscar" (que no hace nada) pero el onBackPressed si funciona.

Así que vuelvo a ponerlo a "always" y añado otra opción de menú más, quedando así:


<item
android:id="@+id/search"
android:title="@string/buscar"
android:icon="@android:drawable/ic_menu_search"
myapp:showAsAction="always"
myapp:actionViewClass="android.support.v7.widget.SearchView"/>

<item
android:id="@+id/acercade"
android:title="@string/acercade"
myapp:showAsAction="never" />


Ahora además de la lupa me aperecen los 3 puntos verticales. Si los pulso aparece la opción "Acerca de" arriba, si pulso el botón de menú aparece "Acerca de" abajo. Y el OnBackPressed() funciona perfectamente.

Y después de todo este rollazo que dejo aquí por si alguien se encuentra el mismo problema es.

¿A alguien más le ha pasado esto y ha encontrado una forma menos chapuza de solucionarlo?

Un saludo.

mocelet
16/09/15, 12:33:39
A ver si se pasa kriogeN por aquí y te lo soluciona en un momento. Oh, espera... O_O tiene que haber un fallo en matrix.

Supongo que cualquier cosa que pueda decirte ya la habrás visto. Hay un hilo en stackoverflow interesante donde discuten que el DrawerLayout se queda los onBackPressed para él y cómo evitarlo. No es lo mismo, pero quizá haya un problema de focos cuando hay menú vacío y sea cuestión de dar el foco al elemento que corresponda.

Por si te inspira algo nada más...

http://stackoverflow.com/questions/18293726/android-onbackpressed-not-being-called-when-navigation-drawer-open

kriogeN
16/09/15, 12:40:35
A ver si se pasa kriogeN por aquí y te lo soluciona en un momento. Oh, espera... O_O tiene que haber un fallo en matrix.

Supongo que cualquier cosa que pueda decirte ya la habrás visto. Hay un hilo en stackoverflow interesante donde discuten que el DrawerLayout se queda los onBackPressed para él y cómo evitarlo. No es lo mismo, pero quizá haya un problema de focos cuando hay menú vacío y sea cuestión de dar el foco al elemento que corresponda.

Por si te inspira algo nada más...

http://stackoverflow.com/questions/18293726/android-onbackpressed-not-being-called-when-navigation-drawer-open

Eso ya lo hice para evitar que si pulso otra acción con el DrawerLayout abierto luego al pulsar Back no se cerraba, ahora se me ejecute mi onBackPressed siempre donde compruebo si el DrawerLayout está abierto o no. Pero si hago lo del menú sin la opción de Acerca de el onBackPressed sigue sin ejecutarse.

(Lo del DrawerLayout es un espectáculo, estas cosas no me pasaban cuando las hacía sin el Toolbar, o no se si será por la librería de soporte 23, la última que usaba era la 19. Pero ya he migrado POR FIN a Android Studio y uso todo nuevo)

Parece que el que se queda el foco es el Toolbar, voy a ponerlo eso mismo al Toolbar a ver si así se soluciona. Ya diré algo.

EDIT: Pues no, no es el Toolbar. Si tampoco es importante, al final la opción de "Acerca de" la usaré, pero es simplemente porque me joden estas cosas que no tienen sentido xD

Dexafree
16/09/15, 23:07:23
Me tocó hacer una aplicación con SearchView y Toolbar y tambien me dio problemas al abrir el SearchView, pero de tema que no cuadraba bien con los otros iconos del menu (tenia que tener searchview y otro icono). Se solapaba con el otro icono, y el otro aparecia como encima del SearchView.
Al final lo solucione a lo chapuza, con referencias a los MenuItem (y una guarrada con Handler.postDelayed para las rotaciones que mejor no cuento, porque aun me siento sucio)

Te recomiendo que pongas un issue en el tracker, a ver si hay suerte.


Pero si hago lo del menú sin la opción de Acerca de el onBackPressed sigue sin ejecutarse.

Sera tonto de preguntar, pero si usas el Drawer usaras fragments... no estaras haciendo override en algun fragment y no llamando a super.onBackPressed..?
Yo que se, por intentar buscarle alguna logica


ya he migrado POR FIN a Android Studio y uso todo nuevo

Bienvenido hombre, ya tocaba! xD

oxot
16/09/15, 23:30:34
Sera tonto de preguntar, pero si usas el Drawer usaras fragments... no estaras haciendo override en algun fragment y no llamando a super.onBackPressed..?
Yo que se, por intentar buscarle alguna logica


Yo he tenido ese problema tonto pero realmente en el Fragment no hay ningún método onBackPressed. Este método lo implemento en la clase Activity y compruebo qué fragment está visible para saber lo que quiero hacer cuando el usuario ha pulsado el botón atrás.

Estooo, si el onBackPressed no se llama es como si la actividad que contiene los fragments hubiera perdido el foco. Si pones un punto de ruptura cuando salta el Search, en el debugger que Actividad ves como la que manda?? Por curiosidad más que nada, no sé si te ayudará.
Quizá este es tu mismo problema:
http://stackoverflow.com/questions/13626756/how-can-i-get-onbackpressed-while-searchview-is-activated

kriogeN
16/09/15, 23:39:04
Me tocó hacer una aplicación con SearchView y Toolbar y tambien me dio problemas al abrir el SearchView, pero de tema que no cuadraba bien con los otros iconos del menu (tenia que tener searchview y otro icono). Se solapaba con el otro icono, y el otro aparecia como encima del SearchView.
Al final lo solucione a lo chapuza, con referencias a los MenuItem (y una guarrada con Handler.postDelayed para las rotaciones que mejor no cuento, porque aun me siento sucio)

Te recomiendo que pongas un issue en el tracker, a ver si hay suerte.




Sera tonto de preguntar, pero si usas el Drawer usaras fragments... no estaras haciendo override en algun fragment y no llamando a super.onBackPressed..?
Yo que se, por intentar buscarle alguna logica




Bienvenido hombre, ya tocaba! xD

Si, uso Fragments, pero en el momento del problema aún no tenía ningún Fragment cargado. Estaba construyendo la Toolbar y el Drawer y de pronto he dejado puesto el dedo en el botón izquierdo del S5 (Menú) y me he dado cuenta que al pulsar atrás no salía de la app. Y ahí ha empezado todo.

No se cual es el problema, pero si pulsas el botón de Menú teniendo como único elemento un SearchView con la opción de que esté siempre en la Toolbar el onBackPressed deja de funcionar, por lo menos en el S5.

oxot
17/09/15, 16:15:15
Si, uso Fragments, pero en el momento del problema aún no tenía ningún Fragment cargado. Estaba construyendo la Toolbar y el Drawer y de pronto he dejado puesto el dedo en el botón izquierdo del S5 (Menú) y me he dado cuenta que al pulsar atrás no salía de la app. Y ahí ha empezado todo.

No se cual es el problema, pero si pulsas el botón de Menú teniendo como único elemento un SearchView con la opción de que esté siempre en la Toolbar el onBackPressed deja de funcionar, por lo menos en el S5.

Y por curiosidad si pones ifRoom, porque supongo que siempre entrará en el huevo y será visible y por saber cómo reacciona el botón...