Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
一个activity多个layout_状态栏设置,希望能够帮助你!!!。
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中,如果是单纯的图片就不用做任何处理:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<View
android:id="@+id/status_bar_fix"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="#00000000"
/>
<!--你的自定义actionbar布局-->
</LinearLayout>
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类中了:
/**
* 获取状态栏高度,在页面还没有显示出来之前
*
* @param a
* @return
*/
public static int getStateBarHeight(Activity a) {
int result = 0;
int resourceId = a.getResources().getIdentifier("status_bar_height",
"dimen", "android");
if (resourceId > 0) {
result = a.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
附:根据listview滚动更改状态栏和actionbar颜色
evaluator = new ArgbEvaluator();
mList.setOnScrollListener(new AbsListView.OnScrollListener() {
private SparseArray recordSp = new SparseArray(0);
private int mCurrentfirstVisibleItem = 0;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
mCurrentfirstVisibleItem = firstVisibleItem;
View firstView = view.getChildAt(0);
if (null != firstView) {
ItemRecod itemRecord = (ItemRecod) recordSp.get(firstVisibleItem);
if (null == itemRecord) {
itemRecord = new ItemRecod();
}
itemRecord.height = firstView.getHeight();
itemRecord.top = firstView.getTop();
recordSp.append(firstVisibleItem, itemRecord);
}
if (headerHeight != -1) {
float scrollPercent = (float) (getScrollY() / headerHeight);
if (scrollPercent >= 0) {
if (scrollPercent > 1) {
scrollPercent = 1;
}
int evaluate = (Integer) evaluator.evaluate(scrollPercent, 0x00000000, 0XFFE93030);
mAcBar.setBackgroundColor(evaluate);
mStateBarFixer.setBackgroundColor(evaluate);//状态栏填充布局也要更改颜色
}
}
// LogUtils.d(xiaoqiang, getScrollY() + );
}
private int getScrollY() {
int height = 0;
for (int i = 0; i < mCurrentfirstVisibleItem; i++) {
ItemRecod itemRecod = (ItemRecod) recordSp.get(i);
if (itemRecod != null) {
height += itemRecod.height;
}
}
ItemRecod itemRecod = (ItemRecod) recordSp.get(mCurrentfirstVisibleItem);
if (null == itemRecod) {
itemRecod = new ItemRecod();
}
return height - itemRecod.top;
}
class ItemRecod {
int height = 0;
int top = 0;
}
});
在onwindowfocuschanged中获取
headerHeight
的高度,由于是在fragment中没有这个方法可以写一个接口或者用eventbus在fragment中调用到高度就是你需要滑动多少后颜色完全变化的高度,相信大家都会根据自己的需要算出来
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章