1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 透明状态栏的实现(Activity里有5个fragment fragment顶部有图片有纯色的actionbar)

透明状态栏的实现(Activity里有5个fragment fragment顶部有图片有纯色的actionbar)

时间:2020-07-25 10:59:02

相关推荐

透明状态栏的实现(Activity里有5个fragment fragment顶部有图片有纯色的actionbar)

新的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出现下图的效果

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。