android:fitsSystemWindows无效

时间:2015-01-29 01:19:08

标签: android android-view

在我的主题中,我定义了以下规则来在状态栏后面绘制我的观点:

<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>

在活动中(onCreate):

getWindow.getDecorView.setSystemUiVisibility(
    View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
)

然后,在我的View中使用Barcodescanner,它应该在状态栏后面绘制,这是有效的。但是,当我将android:fitsSystemWindows应用于任何子视图时,他们都无法调整其位置。但是,当我将它应用于根元素时,它正在工作。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content">

    <my.Scanner
        android:id="@+id/scanner"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <FrameLayout android:layout_width="match_parent"
                 android:layout_height="match_parent"
                 android:fitsSystemWindows="true"> <!-- Should receive a top padding, right? -->

        <View android:layout_width="50dp"
              android:layout_height="50dp"
              android:background="@color/red" />

    </FrameLayout>

</FrameLayout>

Screenshot

7 个答案:

答案 0 :(得分:17)

使用CoordinatorLayout作为视图的root用户,它对我有用。

<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">

答案 1 :(得分:13)

我的问题很可能与多个/嵌套fitsSystemWindows属性有关,这些属性不能像我后面发现的那样起作用。我通过将属性应用于一个视图解决了我的问题,然后通过ViewTreeObserver.OnGlobalLayoutListener将填充复制到需要它们的其他视图。这是一个丑陋的黑客,但现在它的工作。

答案 2 :(得分:2)

我在Android 4.4中遇到了同样的问题

我的问题是<item name="android:windowTranslucentStatus">true</item>

<item name="android:fitsSystemWindows">true</item>

冲突

我的方式是删除 <item name="android:windowTranslucentStatus">true</item>

答案 3 :(得分:1)

有一个简单的方法可以做到这一点。确保您设置了应用于活动的主题样式中的2个元素。

<style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
    ....
    <item name="colorPrimaryDark">@android:color/transparent</item>
    <item name="android:fitsSystemWindows">true</item>
    ...
</style>

无需在布局中添加android:fitsSystemWindows。这将直接添加到其中。

答案 4 :(得分:0)

对我来说,问题是小键盘隐藏了位于活动末尾的editText字段。.我尝试了所有解决方案,但没有任何效果。 在调用setContentView()方法之前,我一直在使用以下代码来使状态栏透明:

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            Window w = getWindow(); // in Activity's onCreate() for instance
            w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
        }

我删除了它,还删除了android:windowSoftInputMode="adjustResize|adjustPan" from the maneifest文件,现在它可以工作了。

答案 5 :(得分:0)

我在6.0棉花糖上遇到了同样的问题。

Window w = getWindow();
w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

为我工作。 下面是我的样式表。希望这会成功。

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowTranslucentNavigation">true</item>
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:statusBarColor">@color/colorPrimaryDark</item>
        <item name="android:windowLightStatusBar">true</item>
</style>

答案 6 :(得分:0)

进行此更改

1. Manifest - create a theme and add window background of your like
2. toolbar in xml -  add the same background in toolbar

这对我有用。