tutorial studio implement fragments example entre dinamicos diferencia activity android android-fragments fragmenttransaction fragmentmanager

android - studio - Se hace clic en un diseño invisible detrás del fragmento:



fragments dinamicos android studio (5)

He creado varios fragmentos y agrego el primer fragmento de la siguiente manera:

mainFragment = (MainFragment) MainFragment.create(); getSupportFragmentManager().beginTransaction() .setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right) .add(R.id.content, mainFragment, MAIN_FRAGMENT_TAG) .commit();

El segundo fragmento se agrega de esta manera:

getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right) //.hide(mainFragment) .add(R.id.content,VenueFragment.create(vid), "Venue Fragment") .addToBackStack(null) .commit(); setDrawerIndicatorEnabled(false);

Ahora, a medida que ve que el método de ocultación no se aplica a esta transacción, y se abre VenueFragment , el problema en este caso es que mientras VenueFragment abrió (y es una vista de pantalla completa) al presionar una sección vacía de este fragmento, se invocan las llamadas de MainFragment vistas MainFragment . ¿Cómo puedo prevenir esto?

Si uso la opción de ocultar, entonces no está sucediendo, pero por alguna razón, la animación para eliminar MainFragment está aumentando y eso hace que sea una experiencia extraña.


Bueno, la respuesta muy rápida es android:clickable="true" en la parte superior de las propiedades de diseño en el fragmento.

Pero sería una mejor práctica si creas una actividad con un FrameLayout y su ID y no otros elementos en esa actividad . Entonces, cuando quiera que aparezca un fragmento en la pantalla, llame a esa actividad y use

getSupportFragmentManager().beginTransaction() .setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right) .replace(R.id.frameLayoutId, mainFragment, MAIN_FRAGMENT_TAG) .commit();

utilice reemplazar en lugar de agregar para que el marco de la actividad se reemplace por el diseño del fragmento dado por el marco


Establecer un onClickListener en VenueFragment funcionará, pero agregaré un poco más de explicación. El hecho de que el fragmento principal tenga un evento táctil es un comportamiento destinado a manejar el caso en el que el fragmento del lugar es transparente. En ese caso, podría ser razonable esperar que el toque pase a través de su vista transparente a la que está debajo. Como tal, Android pasa eventos táctiles hasta que pueden ser manejados. Configurar un onClickListener manejará el evento, evitando que pase a la siguiente Vista. Si desea ser "correcto" sobre la prevención de clics en el fragmento inferior, hay un par de opciones:

  1. Elimine el onClickListener del fragmento principal en OnPause y configúrelo en OnResume. De esa manera, siempre que el fragmento principal no sea el fragmento activo, no se puede hacer clic.
  2. Subclasifica el diseño de nivel superior en tu VenueFragment y reemplaza OnTouchEvent para devolver el valor verdadero. Básicamente, esto hará lo mismo que configurar un onClickListener, pero es posible que la intención de bloquear todos los eventos táctiles sea más clara.

Establezca la propiedad sobre la que se puede hacer clic en la vista del segundo fragmento como verdadera.

Por ejemplo:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" />


Tengo una mejor solución, al menos que lo que pienso: p.

Mientras fragmenta la transacción, use el método ocultar y mostrar.


VenueFragment hacer que se VenueFragment hacer clic en el ViewGroup raíz de VenueFragment para que maneje los eventos de clic y no se transmitan (en el sentido de orden z) al otro Fragment .