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

转自:http://blog.csdn.net/u013951017/article/details/54598801

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

猜你喜欢

转载自blog.csdn.net/huanglei201502/article/details/79444968
今日推荐