关于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值(有点欺骗大众眼睛的意思)尴尬尴尬尴尬


好了,这次笔记就到这里

发布了10 篇原创文章 · 获赞 4 · 访问量 1007

猜你喜欢

转载自blog.csdn.net/qq_25097107/article/details/69946363