coordinatelayout android:fitsSystemWindows 沉浸式状态栏在android4.4 和 4.4以上版本的坑

布局xml层次:为了节省空间只写关键代码

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
  >

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar_layout">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar_layout"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <LinearLayout
                android:id="@+id/head_layout">

               《背景》
            </LinearLayout>
            <android.support.v7.widget.Toolbar
                android:id="@+id/tool_bar"
                app:contentInsetLeft="0dp"
                app:contentInsetStart="0dp"
                app:layout_collapseMode="pin">
                <include layout="@layout/activity_title />
            </android.support.v7.widget.Toolbar>
        </android.support.design.widget.CollapsingToolbarLayout>

        <android.support.design.widget.TabLayout
            android:id="@+id/toolbar_tab">

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

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

    <android.support.v4.view.ViewPager
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

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

1、首先如果要在4.4版本及其以上版本上使用沉浸式状态栏,要为activity配置FLAG_TRANSLUCENT_STATUS,

可以在values中为主题样式添加  <item name="android:windowTranslucentStatus">true</item>,

也可以在activity中添加

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//此FLAG可使状态栏透明,且当前视图在绘制时,从屏幕顶端开始即top = 0开始绘制,这也是实现沉浸效果的基础
}
setContentView(R.layout.activity_my_data);
注意:代码一定要在setContentView之前使用。

2、界面布局延伸到界面顶部时,你会发现状态栏会遮盖“正文”,我们想要的只是背景延伸到顶部,“正文”不向上延伸,那么我们只需要设法让“正文”向下挪一个状态栏高度就可以了。

我们可以在“正文”顶部添加一个view,其高度设置为状态栏高度,背景设置为透明,可以在资源文件中定义高度为25dp;也可以使用java代码为view设置高:
ViewGroup.LayoutParams layoutParams = topview.getLayoutParams();
layoutParams.height = DisplayUtil.getStatusHeightPx(this);
topview.setLayoutParams(layoutParams);
topview.setBackgroundColor(Color.TRANSPARENT);
public static int getStatusHeightPx(Activity act)
{
    int height = 0;
    int resourceId = act.getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        height = act.getResources().getDimensionPixelSize(resourceId);
    }
    return height;
}

3.现在为止我们看一下4.4版本和4.4以上版本的真机调试情况:图一(左)4.4版本明显可以看到就是我们想要的结果,但是图二(右)5.0版本状态栏并没有填充。查阅资料要为“背景”view添加 android:fitsSystemWindows="true"

        

4、在布局文件中为“背景”view添加android:fitsSystemWindows="true",我为toolbar,和headlayout添加了此属性,但是4.4版本 和5.0版本真机调试效果正好和之前的相反:即上图图一(左)是5.0的结果,图二(右)成了4.4的结果。因此我采用的解决方案是通过java代码根据版本来判断是否添加该属性(当然你也可以设置不同的layout文件)。到此可以勉强实现沉浸式状态栏的效果。

private void initStateBar() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        ViewGroup.LayoutParams layoutParams = mTopHoldview.getLayoutParams();//titlebarHolder为添加的顶部的(标题栏上方)占位控件
        layoutParams.height = DisplayUtil.getStatusHeightPx(this);
        mTopHoldview.setLayoutParams(layoutParams);
        mTopHoldview.setBackgroundColor(Color.TRANSPARENT);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mHeadLayout.setFitsSystemWindows(true);
            mToolBar.setFitsSystemWindows(true);
        }

    }
}

fitSystemWindows属性: 官方描述: Boolean internal attribute to adjust view layout based on system windows such as the status bar. If true, adjusts the padding of this view to leave space for the system windows. Will only take effect if this view is in a non-embedded activity. 简单描述: 这个一个boolean值的内部属性,让view可以根据系统窗口(如status bar)来调整自己的布局,如果值为true,就会调整view的paingding属性来给system windows留出空间.... 实际效果: 当status bar为透明或半透明时(4.4以上),系统会设置view的paddingTop值为一个适合的值(status bar的高度)让view的内容不被上拉到状态栏,当在不占据status bar的情况下(4.4以下)会设置paddingTop值为0(因为没有占据status bar所以不用留出空间)。(摘取自:https://github.com/CoolThink/StatusBarAdapt)

5、由于我是在coordinatelayout 和CollapsingToolbarLayout使用的沉浸式,其中有一个效果就是CollapsingToolbarLayout能够滚出屏幕,toolbar固定在顶部。但是当CollapsingToolbarLayout滚出后出现了下图现象,可以看到toolbar和状态栏重叠,并且下方空白。由于下方空白的高度和状态栏的高度很相近(你们觉得有没有?),所以偶就想到是不是fitSystemWindows搞的鬼,我就试着在CollapsingToolbarLayout滚出后将fitSystemWindows设为false,没想到解决这个问题了。。我的做法是通过CollapsingToolbarLayout判断快要滚到toolbar位置的时候将该属性设为false,然后其他情况在设为true,虽然很麻烦,但是最起码能解决目前的情况。

插一句:由于我是通的toolbar  include布局,所以要在为toolbar添加app:contentInsetLeft="0dp" app:contentInsetStart="0dp"属性,不然你会发现布局没有填充toolbar。



参考资料:https://github.com/CoolThink/StatusBarAdapt
http://blog.csdn.net/m075097/article/details/53142391
注:本人还是小白,可能解决方法很二楞,但是目前水平也只能这样了,轻喷。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值