gpt4 book ai didi

android - 对于通过 FragmentTransaction 添加的 fragment ,fitsSystemWindows 效果消失了

转载 作者:IT王子 更新时间:2023-10-28 23:42:55 27 4
gpt4 key购买 nike

我有一个带有抽屉导航和全出血 fragment 的 Activity (顶部的图像必须出现在 Lollipop 的半透明系统栏后面)。虽然我有一个临时解决方案,其中 Fragment 通过简单地膨胀 <fragment> Activity 的 XML 中的标签,看起来不错。

然后我不得不替换 <fragment><FrameLayout>并执行 fragment 事务,现在 fragment 不再出现在系统栏后面,尽管 fitsSystemWindows设置为 true跨越所有必需的层次结构。

我相信 <fragment> 的方式可能会有所不同。在 Activity 的布局中而不是在其自身中膨胀。我在 Google 上搜索并找到了一些针对 KitKat 的解决方案,但这些都不适用于我( Lollipop )。

activity.xml

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:fitsSystemWindows="true">

<FrameLayout
android:id="@+id/fragment_host"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

</FrameLayout>

<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:layout_gravity="start"
android:fitsSystemWindows="true"/>

</android.support.v4.widget.DrawerLayout>

fragment.xml

<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="224dp"
android:fitsSystemWindows="true"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
...

activity.xml 是这样的时候它起作用了:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:fitsSystemWindows="true">

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/fragment"
android:name="com.actinarium.random.ui.home.HomeCardsFragment"
tools:layout="@layout/fragment_home"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:layout_gravity="start"
android:fitsSystemWindows="true"/>

</android.support.v4.widget.DrawerLayout>

最佳答案

当您使用 <fragment> 时,在您的 Fragment 的 onCreateView 中返回的布局直接附加代替 <fragment>标签(如果您查看 View 层次结构,您将永远不会真正看到 <fragment> 标签。

因此在 <fragment>案例,你有

DrawerLayout
CoordinatorLayout
AppBarLayout
...
NavigationView

类似于 cheesesquare作品。这是有效的,因为正如 this blog post 中所解释的那样, DrawerLayoutCoordinatorLayout两者都有不同的规则 fitsSystemWindows适用于他们 - 他们都使用它来插入他们的 subview ,但调用 dispatchApplyWindowInsets()在每个 child 上,允许他们访问 fitsSystemWindows="true"属性。

这与 FrameLayout 等布局的默认行为不同。当你在哪里使用 fitsSystemWindows="true" is 消耗所有插图,盲目地应用填充而不通知任何 subview (这是博客文章的“深度优先”部分)。

所以当您更换 <fragment>带有 FrameLayout 的标签和 FragmentTransactions,您的 View 层次结构变为:

DrawerLayout
FrameLayout
CoordinatorLayout
AppBarLayout
...
NavigationView

因为 Fragment 的 View 被插入到 FrameLayout .该 View 不知道通过fitsSystemWindows subview ,所以您的 CoordinatorLayout永远不会看到该标志或执行其自定义行为。

解决问题实际上相当简单:替换您的 FrameLayout与另一个 CoordinatorLayout 。这确保了 fitsSystemWindows="true"被传递到新膨胀的 CoordinatorLayout来自 fragment 。

另一种同样有效的解决方案是创建 FrameLayout 的自定义子类并覆盖 onApplyWindowInsets()分派(dispatch)给每个 child (在你的情况下只是一个)或使用 ViewCompat.setOnApplyWindowInsetsListener()方法来拦截代码中的调用并从那里分派(dispatch)(不需要子类)。更少的代码通常是最容易维护的,所以我不一定建议通过 CoordinatorLayout 走这些路线。解决方案,除非您对此有强烈的感觉。

关于android - 对于通过 FragmentTransaction 添加的 fragment ,fitsSystemWindows 效果消失了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31190612/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com