gpt4 book ai didi

android - fitSystemWindows 以编程方式实现状态栏透明度

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:34:21 33 4
gpt4 key购买 nike

我的应用程序有一个 Activity ,为每个部分托管不同的 fragment 。我最近通过将 fitSystemWindows 设置为 true 使状态栏变得半透明,这已将其设置为应用程序的背景色。这对于具有工具栏的 fragment 来说很好,颜色匹配,如下所示:

enter image description here

但是我的一个 fragment 有一张照片和一个半透明的工具栏,所以我想让照片也占据状态栏的空间,而不是背景颜色。

我认为解决方案是仅针对该 fragment 将 fitSystemWindows 设置为 false,然后手动向半透明工具栏添加填充。以编程方式执行此操作似乎没有效果,我可能做错了什么?

这是我的主要 Activity 布局:

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

<!-- Container for various fragment layouts, including nav drawer and toolbar -->

</RelativeLayout>

然后从我 fragment 的 onCreateView() 中:

RelativeLayout daddyLayout = (RelativeLayout)getActivity().findViewById(R.id.main_parent_view);
daddyLayout.setFitsSystemWindows(false);
daddyLayout.invalidate();

这似乎没有效果,像这样:

enter image description here

如果我在 main_parent_view 中将 fitSystemWindows 设置为 false,状态栏填充就会消失并且有效,但显然会影响每个 fragment

最佳答案

好吧,你在那里处于两难境地,因为一方面你需要应用插图(因为 Toolbar 应该被正确填充),另一方面你不应该 应用 insets(因为你希望 ImageView 在状态栏下绘制)。

原来框架为这种情况提供了一个很好的 API:

ViewCompat.setOnApplyWindowInsetsListener(toolbar, (v, insets) -> {
((ViewGroup.MarginLayoutParams) v.getLayoutParams()).topMargin =
insets.getSystemWindowInsetTop();
return insets.consumeSystemWindowInsets();
});

假设您的根布局具有 android:fitsSystemWindows="true",现在适当的插入将应用于您的工具栏,而不是ImageView

但是,有个问题。

问题是您的根布局是 RelativeLayout,它不会向其子级发送任何关于 insets 的信息。它的兄弟布局(LinearLayoutFrameLayout)也没有。

如果您有一个“物质化”布局(CoordinatorLayoutDrawerLayout)作为根布局,那么子级将被分配那些窗口插图。

另一种选择是继承 RelativeLayout 并将 WindowInsets 分派(dispatch)到 child 手动。

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

可以看到this answer以获得与您的要求完全相同的详细解释。

enter image description here

关于android - fitSystemWindows 以编程方式实现状态栏透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28387289/

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