Android fitsSystemWindows не работает при замене фрагментов

У меня есть SingleFramgnetActivity , целью которого является только удержание и замена фрагментов внутри него.

Макет выглядит следующим образом:

 <?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> 

Я заменяю Fragments внутри FrameLayout. Когда я устанавливаю fitsSystemWindows в true на макете Fragment , он не отвечает. Фактически он работает только при создании Activity , но как только я заменяю Fragment внутри FrameLayout , параметр fitsSystemWindows игнорируется, а макет находится ниже строки состояния и панели навигации.

Я нашел некоторое решение с пользовательским FrameLayout, который использует устаревшие методы, но по какой-то причине он не работает для меня (тот же результат, что и с обычным FrameLayout), и мне также не нравится идея использовать устаревшие методы.

Solutions Collecting From Web of "Android fitsSystemWindows не работает при замене фрагментов"

Ваш FrameLayout не знает размеров окон, потому что он является родителем – LinearLayout не отправил его. В качестве обходного пути вы можете подклассифицировать LinearLayout и передавать LinearLayout отдельным пользователям:

 @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; } 

Вы можете взглянуть на мой ответ, который объяснит, как это работает, а также как использовать API ViewCompat.setOnApplyWindowInsetsListener .