通过场景转换维护“fitsSystemWindows”窗口插入

时间:2016-11-09 17:02:52

标签: android transitions android-constraintlayout

我有一个在两个场景之间转换的布局。

layout.xml

<FrameLayout
    android:id="@+id/framelayout_1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    // Some background views.

    <FrameLayout
        android:id="@+id/scene_root"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <include layout="@layout/scene_a" />
    </FrameLayout>


</FrameLayout>

RES /布局/ scene_a.xml

<android.support.constraint.ConstraintLayout
    android:id="@+id/constraintlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android">

    // Child views removed for brevity
</android.support.constraint.ConstraintLayout>

场景B布局完全相同。

在活动中,调用ViewCompat.setOnApplyWindowInsetsListener(frameLayout, (v, insets) -> insets);以使用fitsSystemWindows和FrameLayout。

视图在初始视图通胀时是正确的,即在状态栏下绘制视图,但窗口插入内容被推下以避免状态栏。

然而,当我转换到场景B时,fitsSystemWindows提供的填充将丢失并且内容会跳转。场景A在返回时也会丢失填充。

任何帮助都非常赞赏如何通过转换保持此填充。

1 个答案:

答案 0 :(得分:1)

好的,所以与场景转换无关,与android:fitsSystemWindows无关。

使用android:fitsSystemWindows的任何视图的默认行为是使用它传递的窗口插件。插图首先传递深度 - 请参阅此blog

所以在上面的例子中,第一个场景 - 设置android:fitsSystemWindows会消耗插图,因此场景B没有机会。同样,当我转换回场景A时(它们已被消耗)。

我的示例中的修复是从两个场景中删除android:fitsSystemWindows并将其放置在场景根目录中。