一个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中,如果是单纯的图片就不用做任何处理:

<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中调用到高度就是你需要滑动多少后颜色完全变化的高度,相信大家都会根据自己的需要算出来

举报
评论 0