with tutorial style studio iniciar inicializar fragments android android-layout android-fragments

tutorial - navigation drawer android



Android fitsSystemWindows no funciona cuando se reemplazan fragmentos (2)

También podría crear un WindowInsetsFrameLayout personalizado y usar un OnHierarchyChangedListener para solicitar la aplicación de las inserciones nuevamente:

public WindowInsetsFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); // Look for replaced fragments and apply the insets again. setOnHierarchyChangeListener(new OnHierarchyChangeListener() { @Override public void onChildViewAdded(View parent, View child) { requestApplyInsets(); } @Override public void onChildViewRemoved(View parent, View child) { } }); }

Vea esta respuesta detallada: https://stackoverflow.com/a/47349880/3979479

Tengo SingleFramgnetActivity cuyo propósito es solo mantener y reemplazar fragmentos dentro de él.

el diseño se ve así:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" android:orientation="vertical" tools:context=".SingleFragmentActivity" > <include layout="@layout/toolbar"/> <FrameLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>

Estoy reemplazando los Fragments dentro de FrameLayout. Cuando establezco el fitsSystemWindows en true en el diseño de Fragment , no responde. En realidad, solo funciona cuando se crea Activity , pero una vez que reemplazo el Fragment dentro de FrameLayout , se fitsSystemWindows parámetro fitsSystemWindows y el diseño está debajo de la barra de estado y la barra de navegación.

Encontré una solución con FrameLayout personalizado que usa métodos obsoletos, pero por alguna razón no funciona para mí (el mismo resultado que con FrameLayout normal) y tampoco me gusta la idea de utilizar métodos obsoletos.


Su FrameLayout no tiene conocimiento de los tamaños de recuadros de ventana, porque es padre - LinearLayout no lo ha despachado. Como solución alternativa, puede subclase LinearLayout y pasar inserciones a los niños por su cuenta:

@TargetApi(Build.VERSION_CODES.KITKAT_WATCH) @Override public WindowInsets onApplyWindowInsets(WindowInsets insets) { int childCount = getChildCount(); for (int index = 0; index < childCount; index++) getChildAt(index).dispatchApplyWindowInsets(insets); // let children know about WindowInsets return insets; }

Puedes echarle un vistazo a mi respuesta, que explicará detalladamente cómo funciona esto, y también cómo usar ViewCompat.setOnApplyWindowInsetsListener API.