关于android沉浸状态栏的实现方案

最近手上一个项目需要实现状态栏沉浸的效果,其实在activity中实现可以说是很简单的 关键是,项目中涉及到很多fragment和viewpager的嵌套所以走了很多弯路,废话不多说:

1.首先说下activity的实现方法:

a.需要在values/styles文件中创建自己app的主题,如:

<style name="BaseAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:listDivider">@drawable/divider_layout</item>
    <item name="android:dropDownListViewStyle">@style/mySpinnerStyle</item>
    <!--<item name="android:button">@style/BaseButton</item> -->
</style>

<style name="AppTheme" parent="BaseAppTheme" />

b.在res文件夹下分别创建values-v19和values-v21文件夹,并创建styles文件,如:

v19:

<resources>

    <style name="AppTheme" parent="BaseAppTheme">
        <item name="android:windowTranslucentStatus">true</item>
    </style>

</resources>
v21:

<resources>

    <style name="AppTheme" parent="BaseAppTheme">
        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>

</resources>
关于为什么创建两个文件夹是因为在做的过程中经过查找资料,有些教程说创建v19有些说创建v21可是我自己在测试的时候发现单独创建一个没有达到效果,所以最终这样做。

c:需要在activity中的setContentView之前加上此方法的调用:(建议为项目创建baseAvtivity把此调用放在base中)

private void setStatusBar() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Window window = getWindow();
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
                | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(Color.TRANSPARENT);
        window.setNavigationBarColor(Color.TRANSPARENT);
    }
}

d.最后一步要在布局文件中对合适的控件来设置

android:fitsSystemWindows="true"

ok,大功告成!

2.接下来简单说说fragment中的实现:

fragment依附于activity,所以setStatusBar()方法无需重复调用,因此最重要的是

android:fitsSystemWindows="true"

的设置切记不要设置在activity的布局文件中,对于包含viewpager的布局要设置在viewpager中的子fragment布局文件的最外层parentView中,到这里基本效果已经实现,但是会发现我们的布局好像自动往上移了一个statusbar的高度,因此这种情况下对于fragment的布局文件的父布局一定要设置一个合适的paddTop值(有点欺骗大众眼睛的意思)尴尬尴尬尴尬


好了,这次笔记就到这里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值