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.