acvitity和fragment中都可以单独设置的沉浸式状态栏的自定义实现方式(包括白底黑字状态栏)

来源:互联网 发布:分水岭算法代码 编辑:程序博客网 时间:2024/04/29 21:39

目的:

设置安卓的沉浸式状态栏,可以统一设置成全部一样的背景,只需要依赖下方的三方库,在BaseAcvitity中设置就行(对api有要求,4.4以下的不显示效果或者半透明效果),
用来在状态栏设置透明后用一个布局或者imageview填充进去,记得在acvitity或者fragment的根部局要加上
android:fitsSystemWindows=”true”
以免页面布局填充进状态栏,我们要让自己的隐藏布局显示出来和状态栏等高并且填充进去
第一步:
添加三方依赖库(此依赖库主要用于实现项目中所有页面统一颜色或者背景图片的沉浸式状态栏)

 compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'

第二步:
自定义工具类,动态获取状态栏高度(包括acvitity和fragment的两组四个方法)

public class ImmersiveStatusBar {    /**     * 动态的设置状态栏  实现沉浸式状态栏     *     */    public static void initStateInAcvitity(Activity activity, LinearLayout linear_bar) {        //当系统版本为4.4或者4.4以上时可以使用沉浸式状态栏        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            //透明状态栏            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//            activity.getWindow().setFlags(//                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION,//                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);            //透明导航栏//            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//            LinearLayout linear_bar = (LinearLayout) findViewById(R.id.ll_bar);            linear_bar.setVisibility(View.VISIBLE);            //获取到状态栏的高度            int statusHeight = getStatusBarHeightInAcvitity(activity);            //动态的设置隐藏布局的高度            LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) linear_bar.getLayoutParams();            params.height = statusHeight;            linear_bar.setLayoutParams(params);        }    }    /**     * 通过反射的方式获取状态栏高度     *     * @return     */    public static int getStatusBarHeightInAcvitity(Activity activity) {        try {            Class<?> c = Class.forName("com.android.internal.R$dimen");            Object obj = c.newInstance();            Field field = c.getField("status_bar_height");            int x = Integer.parseInt(field.get(obj).toString());            return activity.getResources().getDimensionPixelSize(x);        } catch (Exception e) {            e.printStackTrace();        }        return 0;    }    /**     * 动态的设置Fragment状态栏  实现沉浸式状态栏     *     */    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)    public static void initStateInFragment(Fragment fragment, LinearLayout linear_bar) {        //当系统版本为4.4或者4.4以上时可以使用沉浸式状态栏        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            fragment.getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);            //透明状态栏            fragment.getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);            //需要设置这个 flag 才能调用 setStatusBarColor 来设置状态栏颜色            fragment.getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);//            fragment.getActivity().getWindow().setFlags(//                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION,//                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);            //透明导航栏//            fragment.getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);            ////            LinearLayout linear_bar = (LinearLayout) findViewById(R.id.ll_bar);            //获取到状态栏的高度            int statusHeight = getStatusBarHeightInFragment(fragment);            //动态的设置隐藏布局的高度            RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) linear_bar.getLayoutParams();            params.height = statusHeight;            linear_bar.setLayoutParams(params);//            linear_bar.setBackground(fragment.getActivity().getDrawable(android.R.drawable.bottom_bar));            linear_bar.setVisibility(View.VISIBLE);        }    }    /**     * 通过反射的方式获取Fragment状态栏高度     *     * @return     */    public static int getStatusBarHeightInFragment(Fragment fragment) {        try {            Class<?> c = Class.forName("com.android.internal.R$dimen");            Object obj = c.newInstance();            Field field = c.getField("status_bar_height");            int x = Integer.parseInt(field.get(obj).toString());            return fragment.getActivity().getResources().getDimensionPixelSize(x);        } catch (Exception e) {            e.printStackTrace();        }        return 0;    }}

第三步:
在需要实现沉浸式状态栏的acvitity或者fragment的xml布局文件中添加隐藏布局用于填充透明后的状态栏背景

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:fitsSystemWindows="true"    android:background="@android:color/holo_red_light"    tools:context="com.ytf.myapplication.fragment.Fragment4">    <!--这个是隐藏的布局,然后通过动态的设置高度达到效果-->    <LinearLayout        android:id="@+id/ll_bar4"        android:layout_width="match_parent"        android:layout_height="1dp"        android:orientation="vertical"        android:background="@android:color/holo_red_light"        android:layout_alignParentTop="true"        android:visibility="gone">    </LinearLayout>

第四步:
在Java代码的onResume方法中调用第二步的方法,把隐藏布局作为参数传进去,动态设置他的高度,并进行如下设置:

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)    @Override    public void onResume() {        ImmersiveStatusBar.initStateInFragment(context,ll_bar2);        SystemBarTintManager tintManager = new SystemBarTintManager(getActivity());        tintManager.setStatusBarTintEnabled(true);        tintManager.setStatusBarTintResource(R.color.colorPrimary);//设置系统状态栏颜色//        tintManager.setStatusBarTintDrawable(getResources().getDrawable(R.drawable.mybgcolor_02));//设置系统状态栏背景图        super.onResume();    }

版本控制:如果实现白底黑字的状态栏需要手机系统为6.0以上,4.4——6.0的系统只能是白字,无法改变系统状态栏的颜色,6.0系统如果要实现该状态栏字体颜色为黑色需要在Theme主题中加入:

<item name="android:windowLightStatusBar" tools:ignore="NewApi">true</item>

这样在设置状态栏为白色或者浅颜色时候,6.0系统的状态栏会自动变成黑色
这里将系统分为6.0以上和4.4-6.0连个版本区别显示不同的状态栏,不然如果直接设置白色背景的状态栏,那么状态栏的字体默认也是白色,就看不到了,4.4以下的就不考虑了,因为没有人会用4.4以下的手机,并且4.4以下的版本本身是不支持沉浸式状态栏的,设置了也没用,在Acvitity或者Fragment中进行如下判断:

        if (Build.VERSION.SDK_INT >= 23) {//安卓6.0以上执行白底黑字状态栏            Window window = getWindow();            //取消设置透明状态栏,使 ContentView 内容不再覆盖状态栏            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//          需要设置这个 flag 才能调用 setStatusBarColor 来设置状态栏颜色            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);            //设置状态栏颜色            window.setStatusBarColor(getResources().getColor(R.color.title_bg_color));            //底部导航栏            //window.setNavigationBarColor(activity.getResources().getColor(colorResId));        } else {            ImmersiveStatusBar.initStateInAcvitity(this, ll_top_status);            SystemBarTintManager tintManager = new SystemBarTintManager(this);            tintManager.setStatusBarTintEnabled(true);//        tintManager.setStatusBarTintResource(R.color.title_bg_color);//设置系统状态栏颜色            tintManager.setStatusBarTintDrawable(getResources().getDrawable(R.drawable.wodetitle03));        }

这样在6.0以上系统实现的就是白色背景深色字体的状态栏,如果手机系统是4.4-6.0的实现的就是透明状态栏,颜色可以自定义,也可以是图片背景实现渐变效果,反正只要不设置白色背景就好,因为设置了会看不到状态栏字体
以上实现的效果是在ViewPager+Fragment中切换不同的Fragment时候这是状态栏为不同背景,在acvitity中设置会更加方便,不再赘述

原创粉丝点击