4

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

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

并在 xml 布局中将fitSystemWindows属性设置为填充状态栏高度:

<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 设备上没有应用填充。有什么提示吗?

更新

赏金:为什么在 API16 设备上不应用填充?

4

1 回答 1

-1

来自官方文档Android开发模式

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

但是,在 Lollipop 和更高版本的设备上,我们提供了一些新的 API 来使自定义此行为更加容易,并且与视图的其他行为保持一致。您将改为覆盖 onApplyWindowInsets(),这允许视图根据需要消耗尽可能多或尽可能少的插图,并能够 根据需要在子视图上调用dispatchApplyWindowInsets() 。

如果您只需要在 Lollipop 和更高版本上使用的自定义行为, ViewCompat.setOnApplyWindowInsetsListener()您甚至不需要子类化您的视图,这将优先于视图onApplyWindowInsets()。ViewCompat 还提供了用于调用onApplyWindowInsets()dispatchApplyWindowInsets()无需版本检查的辅助方法。

现在,您需要检查使用了哪个 api 级别的条件,并根据该应用条件进行检查,例如

if(API < Kitkat){
    fitSystemWindows()
}else if(API > Lollipop){
    onApplyWindowInsets()
}

请检查此答案以获取更多详细信息。

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

于 2016-03-29T09:26:40.220 回答