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), и мне также не нравится идея использовать устаревшие методы.

Ваш 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 .