新的APP中需要实现透明状态栏(也有的称为沉浸式状态栏),在实际开发中发现有的页面是单一的activity,有的页面是Activity里有几个fragment,fragment顶部有图片有纯色的actionbar
(1)在单一的activity中,我参考郭霖的一篇博客《Android状态栏微技巧,带你真正理解沉浸式模式》实现了,在activity的oncreate()下:
setContentView(R.layout.activity_welcome);
if(Build.VERSION.SDK_INT>= 21) { View decorView = activity.getWindow().getDecorView();intoption = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LAYOUT_STABLE; decorView.setSystemUiVisibility(option); activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
// ActionBar actionBar = getSupportActionBar();// actionBar.hide();
注:由于项目中,我使用的NoActionBar的主题,所以把隐藏ActionBar的代码注释了,不然会报空指针。
使用了SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION,表示会让应用的主体内容占用系统导航栏的空间,然后又调用了setStatusBarColor()方法将导航栏设置成透明色。
效果如图
(2)Activity里有几个fragment,fragment顶部有图片有纯色的actionbar的情况:
首先在activity下设置和单一activity一样的代码,只在activity的oncreate()中调用上面的方法,这样顶部为图片的fragment能实现透明状态栏
效果如图
其次是纯色的actionbar,比如自定义的actionbar布局可以在外层嵌套一个垂直的Linearlayout,然后添加一个View,在代码中动态的设置这个view的高度为状态栏的高度,来填充状态栏,这样每个fragment就能用自己的布局来控制自己的状态栏显示了,因为actionbar背景有时会随着布局移动改变颜色,这时候状态栏的颜色也要改变,我们只要更改填充的Linearlayout的背景就好了
1:首先是布局处理,在需要布局在状态栏下出现的fragment中
<LinearLayoutxmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/bgHome"android:orientation="vertical"><Viewandroid:id="@+id/status_bar"android:layout_width="match_parent"android:layout_height="0dp"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="@color/white"android:textSize="16sp"android:text="透明状态栏"android:layout_gravity="center"/></LinearLayout>
注:填充Linearlayout的背景颜色为项目中状态栏的颜色值
在fragment中动态的设置view的高度,代码如下:
/*** 在页面没加载出来时,获取状态栏高度*/public static intgetStateBarHeight(Activity a) {intresult = 0;intresourceId = a.getResources().getIdentifier("status_bar_height","dimen","android");Log.e("resourceId",resourceId+"aa");if(resourceId > 0) {result = a.getResources().getDimensionPixelSize(resourceId);}returnresult;}
在fragment中onActivityCreated()方法下获取view控件,并设置view的高度
LinearLayout view= (LinearLayout) getActivity().findViewById( R.id.ll);View mStateBar = view.findViewById( R.id.status_bar);mStateBar.setLayoutParams(newLinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,WindowAttr.getStateBarHeight(getActivity())));//填充状态栏
注:我是把getStateBarHeight(Activity a)封装在WindowAttr类下;Linearlayout为fragment的跟布局
效果如图
强调:如果不在fragment的跟布局Linearlayout下获取view,直接
View mStateBar = getActivity().findViewById( R.id.status_bar);mStateBar.setLayoutParams(newLinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,WindowAttr.getStateBarHeight(getActivity())));//填充状态栏
会导致有些fragment的状态栏的高度为0出现下图的效果