onattach - navegar entre fragments android studio
Fragmento sobre otro tema de fragmento (11)
Cuando #77000000
un fragmento (que es pantalla completa con fondo #77000000
) sobre otro fragmento (llamémoslo principal), mi fragmento principal todavía reacciona a los clics (podemos hacer clic en un botón incluso si no lo vemos).
Pregunta : ¿Cómo prevenir clics en el primer fragmento (principal)?
EDITAR
Desafortunadamente, no puedo ocultar el fragmento principal, porque estoy usando un fondo transparente en el segundo fragmento (para que el usuario pueda ver lo que se encuentra detrás).
Establezca la propiedad en la vista del segundo fragmento en true. La vista captará el evento para que no se pase al fragmento principal. Entonces, si la vista del segundo fragmento es un diseño, este sería el código:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
Esto suena como un caso para DialogFragment. De lo contrario, con Fragment Manager confíe uno para ocultar y el otro para mostrar. Eso ha funcionado para mi.
La adición de android:clickable="true"
no funcionó para mí. Esta solución no funciona en CoordinatorLayout cuando se trata de un diseño principal. Es por eso que he hecho RelativeLayout como diseño principal, agregué android:clickable="true"
y coloqué CoordinatorLayout en este RelativeLayout.
La respuesta aceptable "funcionará", pero también causará un costo de rendimiento (sobregiro, re-medición en el cambio de orientación) ya que el fragmento en la parte inferior todavía se está dibujando. Tal vez debería simplemente encontrar el fragmento por etiqueta o ID y establecer la visibilidad en GONE o VISIBLE cuando necesite volver a mostrar.
En Kotlin:
fragmentManager.findFragmentByTag(BottomFragment.TAG).view.visibility = GONE
Esta solución es preferible a los métodos alternativos hide()
y show()
de FragmentTransaction
cuando se usan animaciones. Simplemente onTransitionStart()
desde onTransitionStart()
y onTransitionEnd()
de Transition.TransitionListener
.
La solución es bastante simple. En nuestro segundo fragmento (que se superpone a nuestro fragmento principal) solo necesitamos capturar el evento onTouch
:
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstance){
View root = somehowCreateView();
/*here is an implementation*/
root.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
return root;
}
Lo que puede hacer es que puede dar un clic en blanco al diseño del fragmento anterior utilizando la propiedad onClick para el diseño principal del fragmento principal y en la actividad puede crear una función doNothing(View view)
y no escribir nada en él. Esto lo hará por ti.
Simplemente agregue clickable="true"
y focusable="true"
al diseño principal
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:focusable="true">
<!--Your views-->
</android.support.constraint.ConstraintLayout>
Tuve múltiples fragmentos con el mismo xml.
Después de pasar horas, quité setPageTransformer
y comencé a trabajar
// viewpager.setPageTransformer(false, new BackgPageTransformer())
Tuve una lógica escalofriante.
public class BackgPageTransformer extends BaseTransformer {
private static final float MIN_SCALE = 0.75f;
@Override
protected void onTransform(View view, float position) {
//view.setScaleX Y
}
@Override
protected boolean isPagingEnabled() {
return true;
}
}
android:focusable="true"
agregar android:focusable="true"
con android:clickable="true"
Clickable
significa que se puede hacer clic con un dispositivo puntero o con un dispositivo táctil.
Focusable
significa que puede obtener el enfoque de un dispositivo de entrada como un teclado. Los dispositivos de entrada como los teclados no pueden decidir a qué vista enviar sus eventos de entrada según las entradas en sí, por lo que los envían a la vista que tiene el foco.
Debe ocultar el primer fragmento cuando muestre el segundo fragmento si dos fragmentos se colocan en la misma vista de contenedor.
Si desea saber más preguntas sobre cómo resolver problemas sobre Fragmentos, puede ver mi biblioteca: https://github.com/JustKiddingBaby/FragmentRigger
FirstFragment firstfragment;
SecondFragment secondFragment;
FragmentManager fm;
FragmentTransaction ft=fm.beginTransaction();
ft.hide(firstfragment);
ft.show(secondFragment);
ft.commit();
La mejor manera es usar FrameLayout, lo estoy usando para fragmentos, por lo que no es necesario declarar fragmentos en otro Xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:background="@color/colorPrimary"
tools:context="com.example.sumedh.fragmentpractice1.MainActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:layout_gravity="center"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:id="@+id/BtnNext"/>
</FrameLayout>