最近手上一个项目需要实现状态栏沉浸的效果,其实在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值(有点欺骗大众眼睛的意思)
好了,这次笔记就到这里