新的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();
int option = 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中
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/bgHome" android:orientation="vertical"> <View android:id="@+id/status_bar" android:layout_width="match_parent" android:layout_height="0dp" /> <TextView android: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 int getStateBarHeight(Activity a) { int result = 0; int resourceId = a.getResources().getIdentifier("status_bar_height", "dimen", "android"); Log.e( "resourceId",resourceId+"aa" ); if (resourceId > 0) { result = a.getResources().getDimensionPixelSize(resourceId); } return result; }
在fragment中onActivityCreated()方法下获取view控件,并设置view的高度
LinearLayout view= (LinearLayout) getActivity().findViewById( R.id.ll); View mStateBar = view.findViewById( R.id.status_bar); mStateBar.setLayoutParams(new LinearLayout.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(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, WindowAttr.getStateBarHeight(getActivity())));//填充状态栏
会导致有些fragment的状态栏的高度为0出现下图的效果