gpt4 book ai didi

android - 即使使用 windowTranslucentStatus 和 fitSystemWindows,CoordinatorLayout 也不会在状态栏后面绘制

转载 作者:IT老高 更新时间:2023-10-28 22:14:36 30 4
gpt4 key购买 nike

我正在尝试在状态栏后面绘制 View ,如下所示: Desired result

我尝试使用推荐的技术来产生这种效果,但我明白了:

Actual result

从屏幕截图中可以清楚地看出,我的应用内容都没有被绘制在状态栏后面。

有趣的是,Nav Drawer 设法在状态栏后面绘制:

enter image description here

我做过的事情:

  • 使用支持库小部件 - CoordinatorLayoutAppBarLayoutToolbarDrawerLayout
  • windowTranslucentStatus 在我的应用主题中设置为 true
  • fitsSystemWindows 在我的 CoordinatorLayout
  • 上设置为 true

这是我的应用主题:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@android:color/transparent</item>
<item name="colorAccent">@color/colorAccent</item>

<item name="android:windowTranslucentStatus">true</item>
</style>

这是我的 Activity 布局:

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

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

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

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

我的 Activity 布局中的 FrameLayout 被这个 fragment 布局替换了:

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

<FrameLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:background="@android:color/holo_blue_bright"
tools:context=".MainActivity">

<TextView android:text="@string/lorem_ipsum"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</FrameLayout>

<android.support.design.widget.AppBarLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
app:elevation="0dp"
android:theme="@style/AppTheme.TransparentAppBar">

<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@android:color/transparent"
app:title="@string/hello_blank_fragment"
app:popupTheme="@style/AppTheme.OverflowMenu" />

</android.support.design.widget.AppBarLayout>

<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
android:src="@android:drawable/ic_dialog_email" />

</android.support.design.widget.CoordinatorLayout>

最佳答案

为 future 的读者编辑:有很多关于这个主题和评论问题的好信息,请务必通读它们。

原答案:你的主题是错误的,这就是原因。不幸的是,如何在 Kitkat 或 Lollipop 中激活存在差异。在我的代码中,我是用 Java 完成的,但如果您想使用资源树上的 V21 文件夹,也可以在 XML 中实现它。参数的名称将与 Java 对应的名称非常相似。

从您的 XML 中删除 android:windowTranslucentStatus 并在 Java 中像这样使用:

   public static void setTranslucentStatusBar(Window window) {
if (window == null) return;
int sdkInt = Build.VERSION.SDK_INT;
if (sdkInt >= Build.VERSION_CODES.LOLLIPOP) {
setTranslucentStatusBarLollipop(window);
} else if (sdkInt >= Build.VERSION_CODES.KITKAT) {
setTranslucentStatusBarKiKat(window);
}
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static void setTranslucentStatusBarLollipop(Window window) {
window.setStatusBarColor(
window.getContext()
.getResources()
.getColor(R.color. / add here your translucent color code /));
}

@TargetApi(Build.VERSION_CODES.KITKAT)
private static void setTranslucentStatusBarKiKat(Window window) {
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}

然后您可以从您的 Activity 中调用 setTranslucentStatusBar(getWindow());

编辑:

使状态栏半透明并在其后面绘制(由于某种原因我无法理解)是 Android 中的两个独立任务。

我对我的代码进行了更多的查看,并且我肯定在我的布局中还有更多的 android:fitsSystemWindows="true" 而不仅仅是 CoordinatorLayout

下面是我的布局上的所有 View ,上面有 android:fitsSystemWindows="true":

  • 协调器布局
  • AppBarLayout
  • CollapsingToolbarLayout
  • ImageView(带背景图片)
  • FrameLayout(带有标题的内容)

所以我的建议是在您的 XML 上测试/尝试填充 android:fitsSystemWindows="true"

关于android - 即使使用 windowTranslucentStatus 和 fitSystemWindows,CoordinatorLayout 也不会在状态栏后面绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33668668/

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