Android超简单沉浸式布局

废话前言
沉浸式真的是个难啃的的东西。不易理解,也是困惑了我好久,现在有时间,来读一读网上大神的帖子学习一下,加上自己的理解。实现起来还是不难的。

只说一种实现起来最简单,最清晰的方法。

三个文件搞定

第一个

res/values/style.xml

<resources
    <!--全屏显示,无透明状态栏-->
    <style name="TranslucentTheme" parent="AppTheme">
        <item name="android:windowFullscreen">true</item>
    </style>
    <!--全屏显示,有透明状态栏-->
    <style name="statusBar" parent="AppTheme">
    </style>
</resources>

第二个

res/values-v19/style.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
     <!--values-v19。v19 开始有 android:windowTranslucentStatus 这个属性,全屏显示,无透明状态栏-->
    <style name="TranslucentTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowTranslucentNavigation">true</item>

        <item name="android:windowFullscreen">true</item>
    </style>
    <!--全屏显示,有透明状态栏-->
    <style name="statusBar" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowTranslucentNavigation">true</item>
    </style>
</resources>

第三个

res/values-v21/style.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- values-v21。5.0 以上提供了 setStatusBarColor()  方法设置状态栏颜色。全屏显示,无透明状态栏-->
    <style name="TranslucentTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowTranslucentStatus">false</item>
        <item name="android:windowTranslucentNavigation">true</item>
        <!--Android 5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色-->
        <item name="android:statusBarColor">@android:color/transparent</item>
        <!--全屏显示-->
        <item name="android:windowFullscreen">true</item>
    </style>
    <!--全屏显示,有透明状态栏-->
    <style name="statusBar" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowTranslucentStatus">false</item>
        <item name="android:windowTranslucentNavigation">true</item>
        <!--Android 5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色-->
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>
</resources>

最后把你的需要的name填写到AndroidManifest.xml内Application的theme中就可以了
就这样就实现了

敲黑板:
1.三个文件缺一不可,有了这三个文件,整个屏幕的都是你的地盘
2.分别说一下style的TranslucentTheme和statusBar:
TranslucentTheme比statusBar多一句话:<item name="android:windowFullscreen">true</item>

加上这句话,透明的状态栏都不会出现,整个屏幕都是你的地盘

去掉这句话也就是statusBar

在顶部出现了透明状态栏。

小结

理论上到这里就结束了,但是类似QQ的那种纯色的状态栏也就没事实现,也就是给状态栏加上背景色。下面我们来做

进阶

我们需要把状态栏的高度给占住,就可以了,有三个办法

办法一
设置 fitsSystemWindows 属性,这种方法不说了,弊端太多,有兴趣可以去了解一下
办法二
手动添加一个view

<View 
 android:id="@+id/statusBarView"
 android:background="@color/blue" 
 android:layout_width="match_parent"
 android:layout_height="wrap_content">
</View>

然后再代码中获取状态栏的高度,赋值给此view。

/** 
* 利用反射获取状态栏高度 
* @return 
*/ 
public int getStatusBarHeight() { 
    int result = 0; //获取状态栏高度的资源id 
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); 
    if (resourceId > 0) { 
        result = getResources().getDimensionPixelSize(resourceId); 
    } 
    return result;
}

开始赋值

View statusBar = findViewById(R.id.statusBarView); 
ViewGroup.LayoutParams layoutParams = statusBar.getLayoutParams(); 
layoutParams.height = getStatusBarHeight();

或者不在xml内写View,直接在代码中动态添加

        ViewGroup contentView = (ViewGroup) this.findViewById(android.R.id.content);
        View statusBarView = new View(this);
        ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight());
        statusBarView.setBackgroundColor(Color.parseColor("#6495ED"));//设置背景颜色
        contentView.addView(statusBarView, lp);

办法三

手动给根视图设置一个 paddingTop,高度为状态栏高度,
然后再在根视图加入一个占位视图,其高度也设置为状态栏高度。

//设置 paddingTop 
ViewGroup rootView = (ViewGroup) mActivity.getWindow().getDecorView().findViewById(android.R.id.content);
rootView.setPadding(0, getStatusBarHeight(mActivity), 0, 0); 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    //5.0 以上直接设置状态栏颜色 
    activity.getWindow().setStatusBarColor(color); 
} else {
 //根布局添加占位状态栏
View statusBarView = new View(activity); 
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
statusBarView.setBackgroundColor(Color.parseColor("#6495ED"));
decorView.addView(statusBarView, lp); 

到这里基本结束了。

总结

1.无论怎样都要建立三个xml文件
2.在有纯色状态栏的情况下,办法二、三都可以很方便的搞定状态栏。
3.办法三我没有验证,是直接搬过来的

参考大神的:https://www.jianshu.com/p/dc20e98b9a90

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值