在API16设备上的fitsSystemWindows不起作用

时间:2016-03-29 08:07:15

标签: android android-support-library android-design-library android-support-design android-drawer

我的活动请求布局为全屏:

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

并在xml布局中设置 fitsSystemWindows 属性以填充状态栏高度:

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

<!-- The main content view -->

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

            <android.support.design.widget.AppBarLayout
                android:id="@+id/appbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:fitsSystemWindows="true">

                <android.support.design.widget.CollapsingToolbarLayout
                    android:id="@+id/collapsing_toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
                    app:contentScrim="@color/actionbar_title_color"
                    android:fitsSystemWindows="true">

使用appcompat-v7:23.2.1编译,它在API21设备上运行良好,但在API16设备上未应用填充。任何提示?

更新

Bounty on: 为什么API16设备上没有应用填充?

1 个答案:

答案 0 :(得分:-1)

来自官方文件Android development pattern

  

在KitKat及以下,您的自定义视图可以覆盖fitSystemWindows()并提供您想要的任何功能 - 只需   如果您已经使用了insets则返回true,如果您愿意,则返回false   给其他意见一个机会。

     

然而,在Lollipop及更高版本的设备上,我们提供了一些新的API   使自定义此行为更容易和一致   视图的其他行为。你会改写    onApplyWindowInsets(),允许View根据需要使用尽可能多的内容,并且可以调用    dispatchApplyWindowInsets()根据需要在子视图上显示。

     

如果只是你,你甚至不需要继承你的视图   在Lollipop上需要自定义行为,您可以使用更高级别的自定义行为   ViewCompat.setOnApplyWindowInsetsListener() ,将会给出   优先于View的onApplyWindowInsets()。 ViewCompat也   提供调用onApplyWindowInsets()和的dispatchApplyWindowInsets()的辅助方法   if(API < Kitkat){ fitSystemWindows() }else if(API > Lollipop){ onApplyWindowInsets() } 没有版本检查。

现在,你需要检查条件,使用哪个api级别,并根据应用条件,如

$("#amount").prev("label").remove();

请查看this answer了解详情。

另请阅读http://developer.android.com/reference/android/view/View.html#fitSystemWindows%28android.graphics.Rect%29