透明状态栏的实现(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(); int option = 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中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/bgHome"
    android:orientation="vertical">
    <View
        android:id="@+id/status_bar"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        />
    <TextView
        android: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 int getStateBarHeight(Activity a) {
    int result = 0;
    int resourceId = a.getResources().getIdentifier("status_bar_height",
            "dimen", "android");
    Log.e( "resourceId",resourceId+"aa" );
    if (resourceId > 0) {
        result = a.getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

在fragment中onActivityCreated()方法下获取view控件,并设置view的高度

LinearLayout  view= (LinearLayout) getActivity().findViewById( R.id.ll);
View mStateBar = view.findViewById( R.id.status_bar);
mStateBar.setLayoutParams(new LinearLayout.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(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
        WindowAttr.getStateBarHeight(getActivity())));//填充状态栏

会导致有些fragment的状态栏的高度为0出现下图的效果


猜你喜欢

转载自blog.csdn.net/qq_35442755/article/details/80525220
今日推荐