Andoid - Como evitar los Fragment superpuestos

Iniciado por MaX2, 22 Abril 2019, 20:00 PM

0 Miembros y 1 Visitante están viendo este tema.

srWhiteSkull

Todo eso es lo mismo que le expliqué en la publicación. Como puedes apreciar el fragmento B sigue vivo y posiblemente el resto de fragmentos. De esa forma cuando usted haga BACK volverá al fragmento que hay debajo.

MaX2

Te respondo con dificultad porque escribo desde el móvil, y no tengo muy buena cobertura.
He probado el código que has puesto y funciona bien, igual como el que tengo yo y puedes ver en el video, pero cuando se colocan unos botones en un Fragment para mostrar otro Fragment, es cuando aparece ese problema de Fragment superpuestos.

Interesa tener los fragment anteriores vivo para poder volver atrás y poder mostrarlo.

Se puede solucionar de alguna forma, he puesto un fondo, pero no es efectivo porque, aunque no se ven los botones, siguen activos, y si se pulsa encima de uno de los botones, aunque no se vea, se abre su fragment.

srWhiteSkull

#12
Entonces si te interesa que estén vivos lo único que debes hacer es que el layout que lo solapa le tengas puesto la propiedad clickable false.

https://developer.android.com/reference/android/view/View#attr_android:clickable

De esa forma al hacer click sobre el fondo no traspasará o no debería traspasarlo y hacer click a lo que haya detrás.

PD Puedes implementarlo también en la vista de diseño (en el XML), así :

android:clickable="false"

MaX2

No se si me dará tiempo a probarlo ahora, pero lo que comentas de poner android:clickable="false", no tengo claro en el xml donde colocarlo, porque en el momento que lo ponga, no se van a anular los botones ?

Quiero decir que la primera vez que entre al fragmen y me muestre los botones si ya los he anulado no podre abrir el otro fragmen, y si lo pongo en el segundo fragment anulara los botones  que hay en este segundo fragment.

srWhiteSkull

#14
Eso va en el XML del fragmento, en sus propiedades, como cuando especificas el ancho, alto o color de fondo (que es lo que habrás hecho para tapar lo que hay detrás). Ese atributo le indica a la aplicación que esa vista no puede ser clickable pero los componentes que existan dentro de esa vista no se verán afectados como botones etc. Creo haber usado eso hace tiempo, pero si lo pruebas ya nos cuentas por aquí y de paso acuérdate de mostrar el XML donde lo incluiste a ver si lo pusiste correctamente.

PD Quizás si tengo tiempo te muestro un ejemplo.

MaX2

Espera srWhiteSkull no te molestes en poner codigo, voy a ver si puedo hacerlo, y si no doy con la solucion te lo digo, pero como te comenta no se si voy a poder hacerlo ahora.

Estaba viendo con el movil, que odio tener que leer desde él, jeje, que tambien hay que poner en el xml esto:


android:focusable="true"
android:focusableInTouchMode="true"


no entiendo porque.

y tambien despues de llamar al FragmenD poner este codigo para ignorará todos botones


FragmenA.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return true;
    }
});



MaX2

Estaba deseando probarlo para ver si puedo seguir con la aplicación, pero no he tenido suerte con android:clickable="false", incluso he llegado a ponerlo en los dos a la vez, en el ConstraintLayout y en FrameLayout, y cuando los botones se siguen quedando activos.


MaX2

Mira srWhiteSkull incluso colocandolo en los dos, en LinearLayout y androidx.constraintlayout.widget.ConstraintLayout los link siguen activos, si que pone un color de fondo para que no se van, pero como digo siguen activos los link que hay debajo.

Tambien lo he puesto en el XML del que se queda debajo, pero nada.


srWhiteSkull

#18
Al final me hicistes probarlo, con lo liado que andaba, y funciona, solo que es con clickable=true, ya que de esa forma la vista que solapa el botón que hay detrás, absorbe el evento y no llega a lo que tenga detrás!!

Una demo (API >=28):
https://drive.google.com/file/d/1sKJjZl-mjxuSbYPlxcmqukYH8JCqPmbS/view?usp=sharing

API min 22 y max 26:
https://drive.google.com/file/d/1JLnSJJRlYHiGMRB8GTzHAZndDZc1G0YF/view?usp=sharing

PD Quita el atributo focusable

MaX2

#19
Gracias de verdad srWhiteSkull, si estabas liado, había preferido que comentases que luego mañana o pasado lo probarías, o cuando estés menos liado, yo he ido respondiendo por si alguien de las mas de 400 visitas que tiene el post podía comentar algo, bueno igual están en la misma situación que yo, aunque creo que sea difícil, jeje.

He  probado el de la API 22 y max 26, porque tengo Android 7.1, y veo que funciona, pero si en un futuro tengo un móvil nuevo, que ya tendrá una API superior, que diferencia hay en el código entre uno y otro ? porque pensaba que si se crea una app para utilizarla en un movil con API 25, esta app tambien funcionaria sin problemas en otros con API 29

Por otro lado, seria posible ver el codigo nuevo que has creado para esta apk, porque estoy colocando el android:clickable="true" y los botones me siguen funcionando.

Por cierto, al pone clickable="true" me dice que tengo que poner también android:focusable="true"

Editado
Espera espera, que con las prisas lo estaba colocando en otro xml, Voy a probarlo en otro proyecto que tengo a ver que tal funciona.