当前位置: 首页 > >

一个activity中有多个fragment的透明状态栏处理

发布时间:

Android 透明状态栏,相信大家都可以找到方法这里再?嗦一下:



/**
* 修改状态栏为全透明
*
* @param activity
*/
@TargetApi(19)
public static void transparencyBar(Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = activity.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);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = activity.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
// ((ViewGroup)activity.findViewById(android.R.id.content)).getChildAt(0).setFitsSystemWindows(true);//设置跟布局fitsystemwindow=true
}


这个方法支持将activity的状态栏透明化,但是有时候我们一个activity中有多个fragment,这些fragment有的是图片在顶部,有的是纯色的actionbar,如果单纯的fitsystemwindow=true,可能造成某些个fragment中的
actionbar也跑到状态栏中或者是图片被顶出了状态栏而达不到效果,这种情况怎么解决呢?往下看:

这样处理:只在activity的oncreate()中调用上面的方法,不像其他教程里面的使用fitsystemwindow把布局往下顶,如果是图片的话就已经处理好了,如果是布局,比如自定义的actionbar布局可以
在外层嵌套一个垂直的linearlayout,然后添加一个View,在代码中动态的设置这个view的高度为状态栏的高度,来填充状态栏,这样每个fragment就能用自己的布局来控制自己的状态栏显示了
,这样做的好处不止这样,因为actionbar背景有时会随着布局移动改变颜色,这时候状态栏的颜色也要改变,我们只要同时更改填充的VIew的背景就好了,是不是很简单:下面直接上代码:
1:首先是布局处理,在需要布局在状态栏下出现的fragment中,如果是单纯的图片就不用做任何处理:

android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
android:id="@+id/status_bar_fix"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="#00000000"
/>

2:在主activity中调用transparencyBar方法,上面已经提供了,我只是把它放在MyStateBarUtil类中。

MyStateBarUtil.transparencyBar(this);

3:动态的设置填充View的高度

View mStateBarFixer = mView.findViewById( R.id.status_bar_fix);
mStateBarFixer.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, WindowAttr.getStateBarHeight(getActivity())));//填充状态栏获取状态栏高度的方法,我放在了WindowAttr类中了:





友情链接: