状态栏设置_android状态栏设置 - CSDN
精华内容
参与话题
  • 状态栏设置

    2019-07-13 22:10:06
    1、General设置设置状态栏的隐藏和显示 隐藏状态栏 2、plist里面View controller-based status bar appearance 设置为NO 3、代码[UIApplicationsharedApplication].statusBarHidden=YES; ios7是由controller...
    ios6里状态栏的显示是由应用程序控制的
    1、General设置设置状态栏的隐藏和显示
    隐藏状态栏
    2、plist里面View controller-based status bar appearance 设置为NO
    3、代码[UIApplication sharedApplication].statusBarHidden = YES;
     
    ios7是由controller来控制状态栏的
    4、-(BOOL)prefersStatusBarHidden

    {

        return YES;

    }

    5、设置状态的样式

    -(UIStatusBarStyle)preferredStatusBarStyle

    {

        return UIStatusBarStyleBlackOpaque;

    }

     

    转载于:https://www.cnblogs.com/bluceZ/p/3936015.html

    展开全文
  • Android 沉浸式状态栏完美解决方案

    万次阅读 多人点赞 2019-06-03 14:21:57
    国内很多类似的文章, 我只想说一个字, 真tm乱! 我看不懂… 评论里面 全在说无效什么的 (我试了也无效, 好厉害的样子) 不废话,回到正题, 首先贴上一个众所周知的库 SystemBarTint 我只要这个类 ...

    注明下,这里只讲状态栏,导航栏后面看有没有必要再讲
    国内很多类似的文章, 我只想说一个字, 真tm乱! 我看不懂… 评论里面 全在说无效什么的 (我试了也无效, 好厉害的样子)

    不废话,回到正题, 首先贴上一个众所周知的库 SystemBarTint
    我只要这个类
    https://github.com/jgilfelt/SystemBarTint/blob/master/library/src/com/readystatesoftware/systembartint/SystemBarTintManager.java
    然后复制到你的工程
    这里写图片描述
    这个类我就不多说了, 就是兼容4.x以上沉浸透明状态栏的 一个兼容类, 有空可以研究下
    #开始
    先贴工具类, 有部分代码参考自网上并有做改动, 但这,不重要…

     
    public class StatusBarUtil {
        public final static int TYPE_MIUI = 0;
        public final static int TYPE_FLYME = 1;
        public final static int TYPE_M = 3;//6.0
    
        @IntDef({TYPE_MIUI,
                TYPE_FLYME,
                TYPE_M})
        @Retention(RetentionPolicy.SOURCE)
        @interface ViewType {
        }
    
        /**
         * 修改状态栏颜色,支持4.4以上版本
         *
         * @param colorId 颜色
         */
        public static void setStatusBarColor(Activity activity, int colorId) {
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                Window window = activity.getWindow();
                window.setStatusBarColor(colorId);
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                //使用SystemBarTintManager,需要先将状态栏设置为透明
                setTranslucentStatus(activity);
                SystemBarTintManager systemBarTintManager = new SystemBarTintManager(activity);
                systemBarTintManager.setStatusBarTintEnabled(true);//显示状态栏
                systemBarTintManager.setStatusBarTintColor(colorId);//设置状态栏颜色
            }
        }
    
        /**
         * 设置状态栏透明
         */
        @TargetApi(19)
        public static void setTranslucentStatus(Activity activity) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                //5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色
                Window window = activity.getWindow();
                View decorView = window.getDecorView();
                //两个 flag 要结合使用,表示让应用的主体内容占用系统状态栏的空间
                int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
                decorView.setSystemUiVisibility(option);
                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();
                WindowManager.LayoutParams attributes = window.getAttributes();
                int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
                attributes.flags |= flagTranslucentStatus;
                //int flagTranslucentNavigation = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
                //attributes.flags |= flagTranslucentNavigation;
                window.setAttributes(attributes);
            }
        }
    
    
        /**
         *  代码实现android:fitsSystemWindows
         *
         * @param activity
         */
        public static void setRootViewFitsSystemWindows(Activity activity, boolean fitSystemWindows) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                ViewGroup winContent = (ViewGroup) activity.findViewById(android.R.id.content);
                if (winContent.getChildCount() > 0) {
                    ViewGroup rootView = (ViewGroup) winContent.getChildAt(0);
                    if (rootView != null) {
                        rootView.setFitsSystemWindows(fitSystemWindows);
                    }
                }
            }
    
        }
    
    
        /**
         * 设置状态栏深色浅色切换 
         */
        public static boolean setStatusBarDarkTheme(Activity activity, boolean dark) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    setStatusBarFontIconDark(activity, TYPE_M, dark);
                } else if (OSUtils.isMiui()) {
                    setStatusBarFontIconDark(activity, TYPE_MIUI, dark);
                } else if (OSUtils.isFlyme()) {
                    setStatusBarFontIconDark(activity, TYPE_FLYME, dark);
                } else {//其他情况
                    return false;
                }
    
                return true;
            }
            return false;
        }
    
        /**
         * 设置 状态栏深色浅色切换
         */
        public static boolean setStatusBarFontIconDark(Activity activity, @ViewType int type,boolean dark) {
            switch (type) {
                case TYPE_MIUI:
                    return setMiuiUI(activity, dark);
                case TYPE_FLYME:
                    return setFlymeUI(activity, dark);
                case TYPE_M:
                default:
                    return setCommonUI(activity,dark);
            }
        }
    
        //设置6.0 状态栏深色浅色切换
        public static boolean setCommonUI(Activity activity, boolean dark) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                View decorView = activity.getWindow().getDecorView();
                if (decorView != null) {
                    int vis = decorView.getSystemUiVisibility();
                    if (dark) {
                        vis |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
                    } else {
                        vis &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
                    }
                    if (decorView.getSystemUiVisibility() != vis) {
                        decorView.setSystemUiVisibility(vis);
                    }
                    return true;
                }
            }
            return false;
    
        }
    
        //设置Flyme 状态栏深色浅色切换
        public static boolean setFlymeUI(Activity activity, boolean dark) {
            try {
                Window window = activity.getWindow();
                WindowManager.LayoutParams lp = window.getAttributes();
                Field darkFlag = WindowManager.LayoutParams.class.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
                Field meizuFlags = WindowManager.LayoutParams.class.getDeclaredField("meizuFlags");
                darkFlag.setAccessible(true);
                meizuFlags.setAccessible(true);
                int bit = darkFlag.getInt(null);
                int value = meizuFlags.getInt(lp);
                if (dark) {
                    value |= bit;
                } else {
                    value &= ~bit;
                }
                meizuFlags.setInt(lp, value);
                window.setAttributes(lp);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
    
        //设置MIUI 状态栏深色浅色切换
        public static boolean setMiuiUI(Activity activity, boolean dark) {
            try {
                Window window = activity.getWindow();
                Class<?> clazz = activity.getWindow().getClass();
                @SuppressLint("PrivateApi") Class<?> layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
                Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
                int darkModeFlag = field.getInt(layoutParams);
                Method extraFlagField = clazz.getDeclaredMethod("setExtraFlags", int.class, int.class);
                extraFlagField.setAccessible(true);
                if (dark) {    //状态栏亮色且黑色字体
                    extraFlagField.invoke(window, darkModeFlag, darkModeFlag);
                } else {
                    extraFlagField.invoke(window, 0, darkModeFlag);
                }
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
        //获取状态栏高度
        public static int getStatusBarHeight(Context context) {
            int result = 0;
            int resourceId = context.getResources().getIdentifier(
                    "status_bar_height", "dimen", "android");
            if (resourceId > 0) {
                result = context.getResources().getDimensionPixelSize(resourceId);
            }
            return result;
        }
    }
    

    好了,这个类 支持了 设置状态栏透明, 设置状态栏颜色, 支持了状态栏深色浅色切换(则状态栏上的文字图标颜色)

    停!

    如果你在看这篇文章, 先不要看别的文章 (23333…) .因为可能会扰乱你的思路,导致你无法理解和使用, 并且你乱入的代码会干扰这边的代码正常工作, 先删掉你在别的文章的代码修改, 相信我, 我这边啥都不用做, 你绝对能以最简单的方式 让你的项目实现沉浸状态栏兼容~ 包括图片沉浸!

    前期准备:
    我就怕你搞了一堆在别的文章的配置,所以我还是要说下以下代码不能出现:
    全局搜索你的代码里 是否有 android:fitsSystemWindows , 删掉!, 没错 删掉!!!
    检查你的values、values-v19、values-v21等 是否配置了
    如下item标签

    // values-v19。v19 开始有 android:windowTranslucentStatus 这个属性
    <style name="TranslucentTheme" parent="Theme.AppCompat.Light.NoActionBar">
            <item name="android:windowTranslucentStatus">true</item>
            <item name="android:windowTranslucentNavigation">true</item>
    </style>
    
    // values-v21。5.0 以上提供了 setStatusBarColor()  方法设置状态栏颜色。
    <style name="TranslucentTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowTranslucentStatus">false</item>
        <item name="android:windowTranslucentNavigation">true</item>
        <!--Android 5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色-->
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>
    

    凡是在style.xml中 有关 windowTranslucentNavigation、windowTranslucentStatus、statusBarColor 统统删掉,全部删掉~
    因为 我们要通过代码去实现, xml中的各种属性全部不要写, 避免代码出现互相干扰, 会出现各种 为啥啊无效啊的bug

    这里我要吐槽一下, 我浏览过很多文章博客, 关于状态栏适配, 一会儿在java 设置setFitsSystemWindows setStatusBarColor 一会儿又回到布局里设置 android:fitsSystemWindows=“xxx” ,一会儿在style 配置 android:windowTranslucentStatus等 一会儿又使用工具类 设置FLAG_TRANSLUCENT_NAVIGATION …,然后还什么4.4 5.x各一份 style ,甚至还拿colorPrimary来乱入一通, 搞得是真的乱! 不信你看完我写的之后再去看别的, 有的说的不全 比如漏了图片如何沉浸没讲 , 或者是漏了图片沉浸后 布局也跟着沉浸进状态栏如何解决没讲… 唉…

    好了干扰已全部去除,开始适配

    首先在Activity 的setContentView 下一行编写如下代码(一般你可以写到你的BaseActivity里,否则你每个activity都得写一次)

    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.xxx);
       
       //这里注意下 因为在评论区发现有网友调用setRootViewFitsSystemWindows 里面 winContent.getChildCount()=0 导致代码无法继续
       //是因为你需要在setContentView之后才可以调用 setRootViewFitsSystemWindows 
       
       //当FitsSystemWindows设置 true 时,会在屏幕最上方预留出状态栏高度的 padding
       StatusBarUtil.setRootViewFitsSystemWindows(this,true);
       //设置状态栏透明
       StatusBarUtil.setTranslucentStatus(this);
       //一般的手机的状态栏文字和图标都是白色的, 可如果你的应用也是纯白色的, 或导致状态栏文字看不清
       //所以如果你是这种情况,请使用以下代码, 设置状态使用深色文字图标风格, 否则你可以选择性注释掉这个if内容
       if (!StatusBarUtil.setStatusBarDarkTheme(this, true)) {
            //如果不支持设置深色风格 为了兼容总不能让状态栏白白的看不清, 于是设置一个状态栏颜色为半透明,
            //这样半透明+白=灰, 状态栏的文字能看得清
            StatusBarUtil.setStatusBarColor(this,0x55000000);
       } 
    }
    

    上面先这样 由于界面风格很多, 比如同一个app有 的界面是黑色风格的页面, 有的是白色风格的页面,有的是顶部是图片的界面希望沉浸进去 这样更好看, 同时 此时状态栏文字要跟随改变

    其实都不用我解释了 就按自己需求 配置呗,工具类都写好功能了.
    比如我这个 4个不同的fragment,有一个是白色, 另外两个是顶部是图片的
    我是这样切换状态栏文字深浅色的,你们参考下
    0界面设置状态栏黑色图标
    这里写图片描述
    123界面设置状态栏白色图标
    这里写图片描述
    代码:
    这里写图片描述
    你还可以随时使用
    StatusBarUtil.setStatusBarColor(this,颜色值);
    设置不同fragment时 的状态栏颜色

    至此 你明白了设置状态栏颜色 和 随界面切换时 该怎么改状态栏颜色或状态栏文字颜色, 没错,你没有漏看! 用了我这个你不需要在xml中 或style中设置各种属性, 也不用判断什么4.4 啊 5.0 啊 6.0啊怎么处理… 就是这么神奇!~

    现在来一个蛋疼的问题

    我要把图片也沉浸进去!!!

    通常 你使用我刚才的代码时 相同颜色的界面没啥问题,比如:
    这里写图片描述
    但 当你界面顶部是图片界面的时候 或者 标题颜色不一样时
    成了这鬼样子,
    这里写图片描述
    这是因为我前面设置了 setRootViewFitsSystemWindows(this,true); 于是带有 paddingTop=状态栏高度 的效果

    首先 你可以选择两种应对办法
    如果顶部不是图片布局 , 可以直接使用 setStatusBarColor 设置相同颜色即可
    如果顶部是图片布局, 那么问题来了
    这里注意了

    想要图片沉浸, 必须设置fitsSystemWindows=false, 以去掉padding效果, 然后想办法 把图片上层的 其他View 整体 paddingTop=状态栏高 让其他View向下挪动

    这句话一定要理解
    ,现在试试在当前带图片的activity 重新设置setRootViewFitsSystemWindows(this,false);
    效果如下(你会发现图标跑左边了, 请无视, 将就看,我是在现有项目中演示的 )
    去掉padding效果后 图片沉浸了! 但内容进入了状态栏里 被遮挡.
    这里写图片描述
    那, 怎么以最方便的方式 让整个内容布局 往下挪动?

    有很多教程都是写的是在代码里 findView 然后设置padding , 很是麻烦, 要是多个界面都这样 代码岂止乱?
    曾经试图在xml中使用 状态栏高度值 ,结果发现这是几乎是不可能的, 因为编译后 xml固定了值,除非使用反射, 但这到了安卓9.0不能反射系统api怎么办…
    于是我想出了一种解决办法

    自定义一个View ,用来做状态栏高度占位

    /**
     * 作者:东芝
     * 功能:状态栏高度View,用于沉浸占位
     */
    
    public class StatusBarHeightView extends LinearLayout {
        private int statusBarHeight;
        private int type;
    
        public StatusBarHeightView(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
            init(attrs);
        }
    
        public StatusBarHeightView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init(attrs);
        }
    
        public StatusBarHeightView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr);
            init(attrs);
    
    
        }
    
        private void init(@Nullable AttributeSet attrs) {
    
            int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                if(resourceId>0) {
                    statusBarHeight = getResources().getDimensionPixelSize(resourceId);
                }
            }else{
                //低版本 直接设置0
                statusBarHeight = 0;
            }
            if (attrs != null) {
                TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.StatusBarHeightView);
                type = typedArray.getInt(R.styleable.StatusBarHeightView_use_type, 0);
                typedArray.recycle();
            }
            if (type == 1) {
                setPadding(getPaddingLeft(), statusBarHeight, getPaddingRight(), getPaddingBottom());
            }
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            if (type == 0) {
                setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),
                        statusBarHeight);
            } else {
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            }
        }
     
    }
    

    attrs.xml

        <declare-styleable name="StatusBarHeightView">
            <attr name="use_type" format="integer">
                <enum name="use_height" value="0" />
                <enum name="use_padding_top" value="1" />
            </attr>
        </declare-styleable>
    

    代码很简单, 就是写一个View, 支持paddingTop= 状态栏高度值 的View,
    解释下两个类型:
    use_height: 设置当前布局高度=状态栏高度值 用于无子View时的占位
    use_padding_top: 设置当前顶部padding=状态栏高度值 用于有子View时的占位
    适配低于4.4时 占位View的高度为0 所以不可见

    使用方法, 用StatusBarHeightView 来包住你要往下移动的内容! 单独留出要沉浸的View不包住,
    举例:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >		
         <!--顶部的需要沉浸的图片View 或其他东西 视频View  等 -->     
         <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@mipmap/icon_top_bg"
            android:scaleType="centerCrop" />
                        
    <!-- app:use_type="use_padding_top 向上paddingTop状态栏高度-->
    	<com.xxx.views.StatusBarHeightView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_marginEnd="@dimen/widget_size_5"
            app:use_type="use_padding_top"
            android:orientation="vertical" >
    		 <!--这里放内容布局或View-->
             <ImageView
                  android:id="@+id/ivUserShare"
                  android:layout_width="@dimen/title_height"
                  android:layout_height="@dimen/title_height"
                  android:padding="@dimen/widget_size_10"
                  android:src="@mipmap/icon_share_white" />
                            
    	</com.xxx.views.StatusBarHeightView>
    </RelativeLayout>
    
    //不要忘记了, 在当前activity onCreate中设置 取消padding,  因为这个padding 我们用代码实现了,不需要系统帮我
    StatusBarUtil.setRootViewFitsSystemWindows(this,false);
    

    java 代码这边不需要改动, 运行app即可.
    完美!
    这里写图片描述

    结束

    值得注意的是 如果你按我那样去做, 状态栏颜色无法被修改, 请检查上层布局是否设置了背景
    或者受了全局主题的

    <item name="android:windowBackground">@color/xxx</item>
    

    的颜色影响

    好了,可能有不对的地方望指出, 或出现任何兼容性适配问题 欢迎在下方评论

    关于兼容性

    该功能已通过大量真机测试, 低版本4.1到安卓9.0 的手机均未出现状态栏错位,颜色重叠显示不清,等问题,而且 app发布到国内外均未反映关于 这个状态栏适配方案导致的bug 或 其他问题, 可放心食用. 至于有一些文章说到 侧滑布局 DrawerLayout 需要特殊处理… 放心, 本文的兼容方案是获取activity 根层布局来处理实现兼容的, 与activity里面是什么布局 无关.

    ================================================================

    ================================================================

    补充:

    ================================================================

    ================================================================

    感谢@Narbolo 的提醒, 漏了个Rom类型判断的工具类,现在贴上

    
    public class OSUtils {
    
        public static final String ROM_MIUI = "MIUI";
        public static final String ROM_EMUI = "EMUI";
        public static final String ROM_FLYME = "FLYME";
        public static final String ROM_OPPO = "OPPO";
        public static final String ROM_SMARTISAN = "SMARTISAN";
        public static final String ROM_VIVO = "VIVO";
        public static final String ROM_QIKU = "QIKU";
    
        private static final String KEY_VERSION_MIUI = "ro.miui.ui.version.name";
        private static final String KEY_VERSION_EMUI = "ro.build.version.emui";
        private static final String KEY_VERSION_OPPO = "ro.build.version.opporom";
        private static final String KEY_VERSION_SMARTISAN = "ro.smartisan.version";
        private static final String KEY_VERSION_VIVO = "ro.vivo.os.version";
    
        private static String sName;
        private static String sVersion;
    
        public static boolean isEmui() {
            return check(ROM_EMUI);
        }
    
        public static boolean isMiui() {
            return check(ROM_MIUI);
        }
    
        public static boolean isVivo() {
            return check(ROM_VIVO);
        }
    
        public static boolean isOppo() {
            return check(ROM_OPPO);
        }
    
        public static boolean isFlyme() {
            return check(ROM_FLYME);
        }
    
        public static boolean is360() {
            return check(ROM_QIKU) || check("360");
        }
    
        public static boolean isSmartisan() {
            return check(ROM_SMARTISAN);
        }
    
        public static String getName() {
            if (sName == null) {
                check("");
            }
            return sName;
        }
    
        public static String getVersion() {
            if (sVersion == null) {
                check("");
            }
            return sVersion;
        }
    
        public static boolean check(String rom) {
            if (sName != null) {
                return sName.equals(rom);
            }
    
            if (!TextUtils.isEmpty(sVersion = getProp(KEY_VERSION_MIUI))) {
                sName = ROM_MIUI;
            } else if (!TextUtils.isEmpty(sVersion = getProp(KEY_VERSION_EMUI))) {
                sName = ROM_EMUI;
            } else if (!TextUtils.isEmpty(sVersion = getProp(KEY_VERSION_OPPO))) {
                sName = ROM_OPPO;
            } else if (!TextUtils.isEmpty(sVersion = getProp(KEY_VERSION_VIVO))) {
                sName = ROM_VIVO;
            } else if (!TextUtils.isEmpty(sVersion = getProp(KEY_VERSION_SMARTISAN))) {
                sName = ROM_SMARTISAN;
            } else {
                sVersion = Build.DISPLAY;
                if (sVersion.toUpperCase().contains(ROM_FLYME)) {
                    sName = ROM_FLYME;
                } else {
                    sVersion = Build.UNKNOWN;
                    sName = Build.MANUFACTURER.toUpperCase();
                }
            }
            return sName.equals(rom);
        }
    
        public static String getProp(String name) {
            String line = null;
            BufferedReader input = null;
            try {
                Process p = Runtime.getRuntime().exec("getprop " + name);
                input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024);
                line = input.readLine();
                input.close();
            } catch (IOException ex) {
                return null;
            } finally {
                if (input != null) {
                    try {
                        input.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return line;
        }
    }
    
    
    展开全文
  • 透明状态栏设置

    2016-02-16 18:05:52
    要在Activity中使用 Translucent System Bar 特性,首先需要到AndroidManifest中为指定的Activity设置Theme。但是需要注意的是,我们不能直接在values/style.xml直接去自定义 Translucet System Bar 的Theme,因为改...
    • 要在Activity中使用 Translucent System Bar 特性,首先需要到AndroidManifest中为指定的Activity设置Theme。但是需要注意的是,我们不能直接在values/style.xml直接去自定义 Translucet System Bar 的Theme,因为改特性仅兼容 Android 4.4 开始的平台,所以直接在values/style.xml声明引入,工程会报错。有些开发者朋友会在代码中去判断SDK的版本,然后再用代码设置Theme。虽然同样可以实现效果,但个人并不推崇这种做法。我所采取的方法则是建立多个SDK版本的values文件夹,系统会根据SDK的版本选择合适的Theme进行设置。大家可以看到上面我的工程里面有valuesvalues-v19values-v21

    第一种方式

    第一种方式,需要做下面三步设置

    1、在valuesvalues-v19values-v21的style.xml都设置一个 Translucent System Bar 风格的Theme

    values/style.xml

    <style name="ImageTranslucentTheme" parent="AppTheme">
        <!--Android 4.4之前的版本上运行,直接跟随系统主题-->
    </style>

    values-v19/style.xml

    <style name="ImageTranslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowTranslucentNavigation">true</item>
    </style>

    values-v21/style.xml

    <style name="ImageTranslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="android:windowTranslucentStatus">false</item>
        <item name="android:windowTranslucentNavigation">true</item>
        <!--Android 5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色-->
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>

    上面需要注意的地方是,无论你在哪个SDK版本的values目录下,设置了主题,都应该在最基本的values下设置一个同名的主题。这样才能确保你的app能够正常运行在 Android 4.4 以下的设备。否则,肯定会报找不到Theme的错误。

    2、在AndroidManifest.xml中对指定Activity的theme进行设置

    <activity
        android:name=".ui.ImageTranslucentBarActivity"
        android:label="@string/image_translucent_bar"
        android:theme="@style/ImageTranslucentTheme" />

    3、在Activity的布局文件中设置背景图片,同时,需要把android:fitsSystemWindows设置为true

    activity_image_translucent_bar.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@mipmap/env_bg"
        android:fitsSystemWindows="true">
    
    </RelativeLayout>

    到此,第一种实现方式完成,大家可以看看下面的效果


    ImageTranslucentTheme效果

    就跟中华万年历的天气预报效果界面一样,系统的整个导航栏都融入了app的界面中,背景图片填满了整个屏幕,看起来舒服很多。这里还有一个android:fitsSystemWindows设置需要注意的地方,后面会在细讲。接下来看第二种实现。

    方式二

    相比中华万年历,QQ音乐采用的是另外一种实现的方式,它将app的Tab栏和系统导航栏分开来设置。


    QQ音乐效果风格

    由于它的Tab栏是纯色的,所以只要把系统通知栏的颜色设置和Tab栏的颜色一致即可,实现上相比方法一要简单很多。同样要到不同SDK版本的values下,创建一个同名的theme,在values-v21下,需要设置系统导航栏的颜色:

    values-v21/style.xml

    <style name="ColorTranslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="android:windowTranslucentStatus">false</item>
        <item name="android:windowTranslucentNavigation">true</item>
        <item name="android:statusBarColor">@color/color_31c27c</item>
    </style>

    再到ColorTranslucentBarActivity的布局文件activity_color_translucent_bar.xml中设置Tab栏的颜色

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        android:orientation="vertical">
    
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="55dp"
            android:background="@color/color_31c27c">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:text="QQ Music"
                android:textColor="@android:color/white"
                android:textSize="20sp" />
    
        </RelativeLayout>
    </LinearLayout>

    到此,我们就可以得到和QQ音乐主界面一样的效果了。


    QQ音乐界面实现效果

    到此,就大体介绍完了 Translucent System Bar 的两种实现方式了。

    android:fitsSystemWindows的“踩坑”

    通过前面的两种方式,大家估计会留意到一个地方,就是所有实现 Translucent System Bar 效果的Activity,都需要在根布局里设置 android:fitsSystemWindows="true" 。设置了该属性的作用在于,不会让系统导航栏和我们app的UI重叠,导致交互问题。这样说可能比较抽象,看看下面两个效果图的对比就知道了。


    有fitsSystemWindows设置

    没有fitsSystemWindows设置

    注:上面的演示效果,是借助了我的另一个开源项目,详情请戳:AndroidAlbum

    这样的话,如果我有10个Activity要实现这种效果,就要在10个布局文件中做设置,非常麻烦。所以,想到一种方法,在theme中加上如下的android:fitsSystemWindows设置:

    <item name="android:fitsSystemWindows">true</item>

    发现果真可以了。所有要实现 Translucent System Bar 的Activity,只需要设置了这个theme即可,改起来也很方便。可惜,后来出现了一个BUG,让我还是得老老实实的回去布局文件中设置。


    Toast文字错位

    Toast打印出来的文字都往上偏移了。这里也是我疏忽的地方,因为在布局文件中设置是对View生效,而到了theme进行设置则是对Window生效了,两者在实现上就不一样了。所以,最终只能改回原来的方式去实现。

    实践总结

    最后做一下小小的总结:

    • 方式一适用于app中没有导航栏,且整体的背景是一张图片的界面;
    • 方式二适用于app中导航栏颜色为纯色的界面;
    • android:fitsSystemWindows设置要在布局文件中,不要到theme中设置;



    之前的App中也用了Translucent System Bar。遇到两个坑:
    1. fitSystemWindow的问题,不光Activity要设置,包含的Fragment的布局也需要设置fitSystemWindow=true。
    2. 4.4上是渐变色的Statusbar,5.0上是完全透明,6.0上又是半透明。下次试试你提到的android:statusBarColor。

    还有目前没有解的一个问题,Statusbar上的文字颜色。目前没有找到方法能改。系统默认白色时如果图片又是白色体验就不好。

    所以最后还是放弃使用Translucent System Bar了。

    展开全文
  • 沉浸式状态栏 设置状态栏颜色

    千次阅读 2017-10-13 22:14:14
    方式一:使用系统API 这个特性是andorid4.4支持的,最少要api19才...在代码中设置  requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题  getWindow().addFlags(WindowManager.LayoutParams.FLAG_

    方式一:使用系统API

    这个特性是andorid4.4支持的,最少要api19才可以使用。

    1、隐藏标题栏等

    在代码中设置
            requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题栏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//窗口透明的状态栏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//窗口透明的导航栏
            setContentView(R.layout.activity_main);

    或者在整个应用的样式中设置
    <resources>
        <style name="AppBaseTheme" parent="android:Theme.Light"></style>
        <style name="AppTheme" parent="AppBaseTheme">
            <!-- 隐藏标题栏 -->
            <item name="android:windowNoTitle">true</item>
            <!-- 窗口透明的状态栏 -->
            <item name="android:windowTranslucentStatus">true</item>
            <!-- 窗口透明的导航栏 -->
            <item name="android:windowTranslucentNavigation">true</item>
        </style>
    </resources>

    此时效果为

    2、在布局中第一个元素中添加如下属性

            android:clipToPadding="true"
            android:fitsSystemWindows="true"
    属性的含义:
    • clipToPadding:控件的绘制区域是否在padding里面,值为true时绘制的区域就包括padding区域;
    • android:fitsSystemWindows:具体的作用就是你的contentview是否忽略actionbar、title、屏幕的底部虚拟按键,将整个屏幕当作可用的空间。正常情况,contentview可用的空间是去除了actionbar、title、底部按键的空间后剩余的可用区域,这个属性设置为true,则忽略,false则不忽略。简单来说,设置为true后,你的可用屏幕是整个屏幕,所以要注意,你的第一个控件是从状态栏那里开始布局的。

    此时效果为
     

    方式二:使用开源框架[废弃了]

    [DEPRECATED] Apply background tinting to the Android system UI when using KitKat translucent modes

    设置状态栏颜色

    Activity

    public class MainActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //为使用 ImageView 作为头部的界面设置状态栏透明
            //StatusBarUtil.setTranslucentForImageView(Activity activity, int statusBarAlpha, View needOffsetView)
            //为包含 DrawerLayout 的界面设置状态栏颜色(也可以设置半透明和全透明)
            //StatusBarUtil.setColorForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int color)
        }
        private int num = 0;
        public void click(View v) {
            switch (num % 3) {
            case 1:
                //设置状态栏半透明
                StatusBarUtil.setTranslucent(this, 50);//值需要在 0 ~ 255 之间
                break;
            case 2:
                //设置状态栏全透明
                StatusBarUtil.setTransparent(this);
                break;
            default:
                //设置状态栏颜色
                StatusBarUtil.setColor(this, 0xff0000);
                break;
            }
            num++;
        }
    }

    工具类

    import android.annotation.TargetApi;
    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Color;
    import android.os.Build;
    import android.support.v4.widget.DrawerLayout;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.WindowManager;
    import android.widget.LinearLayout;
    public class StatusBarUtil {
        public static final int DEFAULT_STATUS_BAR_ALPHA = 112;//透明度默认值,在 0 ~ 255 之间
        public static final int FAKE_STATUS_BAR_VIEW_ID = R.id.statusbarutil_fake_status_bar_view;
        public static final int FAKE_TRANSLUCENT_VIEW_ID = R.id.statusbarutil_translucent_view;
        /**
         * 设置状态栏颜色
         *
         * @param activity 需要设置的 activity
         * @param color    状态栏颜色值
         */
        public static void setColor(Activity activity, int color) {
            setColor(activity, color, DEFAULT_STATUS_BAR_ALPHA);
        }
        /**
         * 设置状态栏颜色
         *
         * @param activity       需要设置的activity
         * @param color          状态栏颜色值
         * @param statusBarAlpha 状态栏透明度
         */
        public static void setColor(Activity activity, int color, int statusBarAlpha) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//API 21,Android 5.0
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                activity.getWindow().setStatusBarColor(calculateStatusColor(color, statusBarAlpha));
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//API 19,Android 4.4
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
                View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID);
                if (fakeStatusBarView != null) {
                    if (fakeStatusBarView.getVisibility() == View.GONE) {
                        fakeStatusBarView.setVisibility(View.VISIBLE);
                    }
                    fakeStatusBarView.setBackgroundColor(calculateStatusColor(color, statusBarAlpha));
                } else {
                    decorView.addView(createStatusBarView(activity, color, statusBarAlpha));
                }
                setRootView(activity);
            }
        }
        /**
         * 设置状态栏纯色 不加半透明效果
         *
         * @param activity 需要设置的 activity
         * @param color    状态栏颜色值
         */
        public static void setColorNoTranslucent(Activity activity, int color) {
            setColor(activity, color, 0);
        }

        /**
         * 设置状态栏颜色(5.0以下无半透明效果,不建议使用)
         *
         * @param activity 需要设置的 activity
         * @param color    状态栏颜色值
         */
        @Deprecated
        public static void setColorDiff(Activity activity, int color) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            transparentStatusBar(activity);
            ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
            // 移除半透明矩形,以免叠加
            View fakeStatusBarView = contentView.findViewById(FAKE_STATUS_BAR_VIEW_ID);
            if (fakeStatusBarView != null) {
                if (fakeStatusBarView.getVisibility() == View.GONE) {
                    fakeStatusBarView.setVisibility(View.VISIBLE);
                }
                fakeStatusBarView.setBackgroundColor(color);
            } else {
                contentView.addView(createStatusBarView(activity, color));
            }
            setRootView(activity);
        }
        /**
         * 使状态栏半透明
         *
         * 适用于图片作为背景的界面,此时需要图片填充到状态栏
         *
         * @param activity 需要设置的activity
         */
        public static void setTranslucent(Activity activity) {
            setTranslucent(activity, DEFAULT_STATUS_BAR_ALPHA);
        }
        /**
         * 使状态栏半透明
         *
         * 适用于图片作为背景的界面,此时需要图片填充到状态栏
         *
         * @param activity       需要设置的activity
         * @param statusBarAlpha 状态栏透明度,默认值是112,该值需要在 0 ~ 255 之间
         */
        public static void setTranslucent(Activity activity, int statusBarAlpha) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            setTransparent(activity);
            addTranslucentView(activity, statusBarAlpha);
        }

        /**
         * 针对根布局是 CoordinatorLayout, 使状态栏半透明
         *
         * 适用于图片作为背景的界面,此时需要图片填充到状态栏
         *
         * @param activity       需要设置的activity
         * @param statusBarAlpha 状态栏透明度
         */
        public static void setTranslucentForCoordinatorLayout(Activity activity, int statusBarAlpha) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            transparentStatusBar(activity);
            addTranslucentView(activity, statusBarAlpha);
        }
        /**
         * 设置状态栏全透明
         *
         * @param activity 需要设置的activity
         */
        public static void setTransparent(Activity activity) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            transparentStatusBar(activity);
            setRootView(activity);
        }
        /**
         * 使状态栏透明(5.0以上半透明效果,不建议使用)
         * 适用于图片作为背景的界面,此时需要图片填充到状态栏
         *
         * @param activity 需要设置的activity
         */
        @Deprecated
        public static void setTranslucentDiff(Activity activity) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                // 设置状态栏透明
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                setRootView(activity);
            }
        }
        /**
         * 为DrawerLayout 布局设置状态栏变色
         *
         * @param activity     需要设置的activity
         * @param drawerLayout DrawerLayout
         * @param color        状态栏颜色值
         */
        public static void setColorForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int color) {
            setColorForDrawerLayout(activity, drawerLayout, color, DEFAULT_STATUS_BAR_ALPHA);
        }
        /**
         * 为DrawerLayout 布局设置状态栏颜色,纯色
         *
         * @param activity     需要设置的activity
         * @param drawerLayout DrawerLayout
         * @param color        状态栏颜色值
         */
        public static void setColorNoTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int color) {
            setColorForDrawerLayout(activity, drawerLayout, color, 0);
        }
        /**
         * 为DrawerLayout 布局设置状态栏变色
         *
         * @param activity       需要设置的activity
         * @param drawerLayout   DrawerLayout
         * @param color          状态栏颜色值
         * @param statusBarAlpha 状态栏透明度
         */
        public static void setColorForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int color, int statusBarAlpha) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
            } else {
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            }
            // 生成一个状态栏大小的矩形
            // 添加 statusBarView 到布局中
            ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);
            View fakeStatusBarView = contentLayout.findViewById(FAKE_STATUS_BAR_VIEW_ID);
            if (fakeStatusBarView != null) {
                if (fakeStatusBarView.getVisibility() == View.GONE) {
                    fakeStatusBarView.setVisibility(View.VISIBLE);
                }
                fakeStatusBarView.setBackgroundColor(color);
            } else {
                contentLayout.addView(createStatusBarView(activity, color), 0);
            }
            // 内容布局不是 LinearLayout 时,设置padding top
            if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) {
                contentLayout.getChildAt(1).setPadding(contentLayout.getPaddingLeft()getStatusBarHeight(activity) + contentLayout.getPaddingTop(),
                        contentLayout.getPaddingRight(), contentLayout.getPaddingBottom());
            }
            // 设置属性
            setDrawerLayoutProperty(drawerLayout, contentLayout);
            addTranslucentView(activity, statusBarAlpha);
        }
        /**
         * 设置 DrawerLayout 属性
         *
         * @param drawerLayout              DrawerLayout
         * @param drawerLayoutContentLayout DrawerLayout 的内容布局
         */
        private static void setDrawerLayoutProperty(DrawerLayout drawerLayout, ViewGroup drawerLayoutContentLayout) {
            ViewGroup drawer = (ViewGroup) drawerLayout.getChildAt(1);
            drawerLayout.setFitsSystemWindows(false);
            drawerLayoutContentLayout.setFitsSystemWindows(false);
            drawerLayoutContentLayout.setClipToPadding(true);
            drawer.setFitsSystemWindows(false);
        }
        /**
         * 为DrawerLayout 布局设置状态栏变色(5.0以下无半透明效果,不建议使用)
         *
         * @param activity     需要设置的activity
         * @param drawerLayout DrawerLayout
         * @param color        状态栏颜色值
         */
        @Deprecated
        public static void setColorForDrawerLayoutDiff(Activity activity, DrawerLayout drawerLayout, int color) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                // 生成一个状态栏大小的矩形
                ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);
                View fakeStatusBarView = contentLayout.findViewById(FAKE_STATUS_BAR_VIEW_ID);
                if (fakeStatusBarView != null) {
                    if (fakeStatusBarView.getVisibility() == View.GONE) {
                        fakeStatusBarView.setVisibility(View.VISIBLE);
                    }
                    fakeStatusBarView.setBackgroundColor(calculateStatusColor(color, DEFAULT_STATUS_BAR_ALPHA));
                } else {
                    // 添加 statusBarView 到布局中
                    contentLayout.addView(createStatusBarView(activity, color), 0);
                }
                // 内容布局不是 LinearLayout 时,设置padding top
                if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) {
                    contentLayout.getChildAt(1).setPadding(0, getStatusBarHeight(activity), 0, 0);
                }
                // 设置属性
                setDrawerLayoutProperty(drawerLayout, contentLayout);
            }
        }
        /**
         * 为 DrawerLayout 布局设置状态栏透明
         *
         * @param activity     需要设置的activity
         * @param drawerLayout DrawerLayout
         */
        public static void setTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout) {
            setTranslucentForDrawerLayout(activity, drawerLayout, DEFAULT_STATUS_BAR_ALPHA);
        }
        /**
         * 为 DrawerLayout 布局设置状态栏透明
         *
         * @param activity     需要设置的activity
         * @param drawerLayout DrawerLayout
         */
        public static void setTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int statusBarAlpha) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            setTransparentForDrawerLayout(activity, drawerLayout);
            addTranslucentView(activity, statusBarAlpha);
        }
        /**
         * 为 DrawerLayout 布局设置状态栏透明
         *
         * @param activity     需要设置的activity
         * @param drawerLayout DrawerLayout
         */
        public static void setTransparentForDrawerLayout(Activity activity, DrawerLayout drawerLayout) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
            } else {
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            }
            ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);
            // 内容布局不是 LinearLayout 时,设置padding top
            if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) {
                contentLayout.getChildAt(1).setPadding(0, getStatusBarHeight(activity), 0, 0);
            }
            // 设置属性
            setDrawerLayoutProperty(drawerLayout, contentLayout);
        }
        /**
         * 为 DrawerLayout 布局设置状态栏透明(5.0以上半透明效果,不建议使用)
         *
         * @param activity     需要设置的activity
         * @param drawerLayout DrawerLayout
         */
        @Deprecated
        public static void setTranslucentForDrawerLayoutDiff(Activity activity, DrawerLayout drawerLayout) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                // 设置状态栏透明
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                // 设置内容布局属性
                ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);
                contentLayout.setFitsSystemWindows(true);
                contentLayout.setClipToPadding(true);
                // 设置抽屉布局属性
                ViewGroup vg = (ViewGroup) drawerLayout.getChildAt(1);
                vg.setFitsSystemWindows(false);
                // 设置 DrawerLayout 属性
                drawerLayout.setFitsSystemWindows(false);
            }
        }

        /**
         * 为头部是 ImageView 的界面设置状态栏全透明
         *
         * @param activity       需要设置的activity
         * @param needOffsetView 需要向下偏移的 View
         */
        public static void setTransparentForImageView(Activity activity, View needOffsetView) {
            setTranslucentForImageView(activity, 0, needOffsetView);
        }
        /**
         * 为头部是 ImageView 的界面设置状态栏透明(使用默认透明度)
         *
         * @param activity       需要设置的activity
         * @param needOffsetView 需要向下偏移的 View
         */
        public static void setTranslucentForImageView(Activity activity, View needOffsetView) {
            setTranslucentForImageView(activity, DEFAULT_STATUS_BAR_ALPHA, needOffsetView);
        }
        /**
         * 为头部是 ImageView 的界面设置状态栏透明
         *
         * @param activity       需要设置的activity
         * @param statusBarAlpha 状态栏透明度
         * @param needOffsetView 需要向下偏移的 View
         */
        public static void setTranslucentForImageView(Activity activity, int statusBarAlpha, View needOffsetView) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            setTransparentForWindow(activity);
            addTranslucentView(activity, statusBarAlpha);
            if (needOffsetView != null) {
                ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) needOffsetView.getLayoutParams();
                layoutParams.setMargins(layoutParams.leftMargin, layoutParams.topMargin + getStatusBarHeight(activity), layoutParams.rightMargin,
                        layoutParams.bottomMargin);
            }
        }
        /**
         * 为 fragment 头部是 ImageView 的设置状态栏透明
         *
         * @param activity       fragment 对应的 activity
         * @param needOffsetView 需要向下偏移的 View
         */
        public static void setTranslucentForImageViewInFragment(Activity activity, View needOffsetView) {
            setTranslucentForImageViewInFragment(activity, DEFAULT_STATUS_BAR_ALPHA, needOffsetView);
        }
        /**
         * 为 fragment 头部是 ImageView 的设置状态栏透明
         *
         * @param activity       fragment 对应的 activity
         * @param needOffsetView 需要向下偏移的 View
         */
        public static void setTransparentForImageViewInFragment(Activity activity, View needOffsetView) {
            setTranslucentForImageViewInFragment(activity, 0, needOffsetView);
        }
        /**
         * 为 fragment 头部是 ImageView 的设置状态栏透明
         *
         * @param activity       fragment 对应的 activity
         * @param statusBarAlpha 状态栏透明度
         * @param needOffsetView 需要向下偏移的 View
         */
        public static void setTranslucentForImageViewInFragment(Activity activity, int statusBarAlpha, View needOffsetView) {
            setTranslucentForImageView(activity, statusBarAlpha, needOffsetView);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
                clearPreviousSetting(activity);
            }
        }
        /**
         * 隐藏伪状态栏 View
         *
         * @param activity 调用的 Activity
         */
        public static void hideFakeStatusBarView(Activity activity) {
            ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
            View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID);
            if (fakeStatusBarView != null) {
                fakeStatusBarView.setVisibility(View.GONE);
            }
            View fakeTranslucentView = decorView.findViewById(FAKE_TRANSLUCENT_VIEW_ID);
            if (fakeTranslucentView != null) {
                fakeTranslucentView.setVisibility(View.GONE);
            }
        }
        ///
        @TargetApi(Build.VERSION_CODES.KITKAT)
        private static void clearPreviousSetting(Activity activity) {
            ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
            View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID);
            if (fakeStatusBarView != null) {
                decorView.removeView(fakeStatusBarView);
                ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);
                rootView.setPadding(0, 0, 0, 0);
            }
        }
        /**
         * 添加半透明矩形条
         *
         * @param activity       需要设置的 activity
         * @param statusBarAlpha 透明值
         */
        private static void addTranslucentView(Activity activity, int statusBarAlpha) {
            ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
            View fakeTranslucentView = contentView.findViewById(FAKE_TRANSLUCENT_VIEW_ID);
            if (fakeTranslucentView != null) {
                if (fakeTranslucentView.getVisibility() == View.GONE) {
                    fakeTranslucentView.setVisibility(View.VISIBLE);
                }
                fakeTranslucentView.setBackgroundColor(Color.argb(statusBarAlpha, 0, 0, 0));
            } else {
                contentView.addView(createTranslucentStatusBarView(activity, statusBarAlpha));
            }
        }
        /**
         * 生成一个和状态栏大小相同的彩色矩形条
         *
         * @param activity 需要设置的 activity
         * @param color    状态栏颜色值
         * @return 状态栏矩形条
         */
        private static StatusBarView createStatusBarView(Activity activity, int color) {
            return createStatusBarView(activity, color, 0);
        }
        /**
         * 生成一个和状态栏大小相同的半透明矩形条
         *
         * @param activity 需要设置的activity
         * @param color    状态栏颜色值
         * @param alpha    透明值
         * @return 状态栏矩形条
         */
        private static StatusBarView createStatusBarView(Activity activity, int color, int alpha) {
            // 绘制一个和状态栏一样高的矩形
            StatusBarView statusBarView = new StatusBarView(activity);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENTgetStatusBarHeight(activity));
            statusBarView.setLayoutParams(params);
            statusBarView.setBackgroundColor(calculateStatusColor(color, alpha));
            statusBarView.setId(FAKE_STATUS_BAR_VIEW_ID);
            return statusBarView;
        }
        /**
         * 设置根布局参数
         */
        private static void setRootView(Activity activity) {
            ViewGroup parent = (ViewGroup) activity.findViewById(android.R.id.content);
            for (int i = 0, count = parent.getChildCount(); i < count; i++) {
                View childView = parent.getChildAt(i);
                if (childView instanceof ViewGroup) {
                    childView.setFitsSystemWindows(true);
                    ((ViewGroup) childView).setClipToPadding(true);
                }
            }
        }
        /**
         * 设置透明
         */
        private static void setTransparentForWindow(Activity activity) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
                activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            }
        }
        /**
         * 使状态栏透明
         */
        @TargetApi(Build.VERSION_CODES.KITKAT)
        private static void transparentStatusBar(Activity activity) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
                activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
            } else {
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            }
        }
        /**
         * 创建半透明矩形 View
         *
         * @param alpha 透明值
         * @return 半透明 View
         */
        private static StatusBarView createTranslucentStatusBarView(Activity activity, int alpha) {
            // 绘制一个和状态栏一样高的矩形
            StatusBarView statusBarView = new StatusBarView(activity);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENTgetStatusBarHeight(activity));
            statusBarView.setLayoutParams(params);
            statusBarView.setBackgroundColor(Color.argb(alpha, 0, 0, 0));
            statusBarView.setId(FAKE_TRANSLUCENT_VIEW_ID);
            return statusBarView;
        }
        /**
         * 获取状态栏高度
         *
         * @param context context
         * @return 状态栏高度
         */
        private static int getStatusBarHeight(Context context) {
            // 获得状态栏高度
            int resourceId = context.getResources().getIdentifier("status_bar_height""dimen""android");
            return context.getResources().getDimensionPixelSize(resourceId);
        }
        /**
         * 计算状态栏颜色
         *
         * @param color color值
         * @param alpha alpha值
         * @return 最终的状态栏颜色
         */
        private static int calculateStatusColor(int color, int alpha) {
            if (alpha == 0) {
                return color;
            }
            float a = 1 - alpha / 255f;
            int red = color >> 16 & 0xff;
            int green = color >> 8 & 0xff;
            int blue = color & 0xff;
            red = (int) (red * a + 0.5);
            green = (int) (green * a + 0.5);
            blue = (int) (blue * a + 0.5);
            return 0xff << 24 | red << 16 | green << 8 | blue;
        }
    }

    布局

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="#5c0"
        android:clipToPadding="true"
        android:fitsSystemWindows="true"
        android:orientation="vertical" >
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:onClick="click"
            android:text="沉浸式状态栏"
            android:textColor="#f00"
            android:textSize="15sp" />
    </LinearLayout>

    样式

    <resources>
        <style name="AppBaseTheme" parent="android:Theme.Light"></style>
        <style name="AppTheme" parent="AppBaseTheme">
            <!-- 隐藏标题栏 -->
            <item name="android:windowNoTitle">true</item>
            <!-- 窗口透明的状态栏 -->
            <item name="android:windowTranslucentStatus">true</item>
            <!-- 窗口透明的导航栏 -->
            <item name="android:windowTranslucentNavigation">true</item>
        </style>
    </resources>

    ids.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <item type="id" name="statusbarutil_fake_status_bar_view" />
        <item type="id" name="statusbarutil_translucent_view" />
    </resources>

    展开全文
  • android状态栏设置

    2017-07-25 09:32:10
    1.全屏且显示状态栏,状态栏会遮挡内容 getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); /*--------------*...
  • vim的状态栏设置

    千次阅读 2012-12-09 15:07:19
    vim的状态栏设置 配置: set laststatus=2 “长久显示:1 set statusline=%t\ %y\ format:\ %{&ff};\ [%c,%l] 自己定做: set statusline 定制格式 状态栏的定制类似C语言特性,常见的定制格式: c ~>...
  • 2.状态栏为背景图片效果 状态栏为图片效果.jpg 3.侧滑页面效果 侧滑页面效果.jpg 4.自定义渐变效果 自定义渐变效果.jpg 5.含ActionBar效果 含ActionBar效果.jpg 工具类 package 包名; import ...
  • 一:整体设置状态栏颜色:(亲测暂时无效) void main() { runApp(MyApp()); //黑色 SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.dark); ////白色 SystemChrome.setSystemUIOverlayStyle...
  • Qt 状态栏设置

    千次阅读 2018-08-11 17:34:11
    一、添加动作状态提示 二、显示其他临时信息 三、显示永久信息       正文 一、添加动作状态提示   1.首先还是打开上一篇完成的程序。对于菜单动作添加状态提示,可以很容易的在设计器中来完成。   ...
  • iOS状态栏设置

    千次阅读 2018-12-21 14:02:21
    iOS状态栏设置 默认启动页的status 默认的viewController状态栏 一. 状态栏显示和隐藏 1.1 启动页 启动页隐藏StatusBar(默认为NO): Status bar is initially hidden = YES 1.2 普通viewController 普通的...
  • //第一种 简单的方式,直接把状态栏顶掉。为透明色。 //在Activity里使用: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { int flagTranslucentStatus = WindowManager.LayoutParams....
  • window用于设置小程序的状态栏、导航条、标题、窗口背景色。属性类型默认值描述最低版本navigationBarBackgroundColorHexColor#000000导航栏背景颜色,如"#000000" navigationBarTextStyleStringwhite...
  • Android开发技巧——设置系统状态栏颜色

    万次阅读 多人点赞 2017-07-28 22:15:06
    如何实现实现设置系统状态栏颜色需要至少在Android 4.4.2(API 19)以上。这是因为,在这个版本以下,没有任何的API可以帮助我们来实现。那么具体如何设置呢?Android 4.4.2实现Android 4.4.2新增了一个特性,即可以...
  • Android6.0 以上设置状态栏字体颜色

    万次阅读 2018-03-29 19:08:43
    * Android 6.0 以上设置状态栏颜色 */ protected void setStatusBar(@ColorInt int color) { if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.M) { // 设置状态栏底色颜色 ...
  • iOS开发技巧:设置状态栏字体颜色

    万次阅读 2016-10-09 16:51:12
    状态栏的字体为黑色:UIStatusBarStyleDefault 状态栏的字体为白色:UIStatusBarStyleLightContent 一、在info.plist中,将View controller-based status bar appearance设为NO 状态栏字体的颜色只由下面的属性...
  • h5+ 设置移动端系统状态栏颜色

    万次阅读 2018-04-26 16:24:56
    // H5 plus事件处理 function plusReady() { // 设置系统状态栏背景为红色 var type = plus.os.name; if(type == "iOS") { plus.navigator.setStatusBarBackground("#368CBD"); ...
  • Android沉浸式状态栏(透明状态栏)最佳实现

    万次阅读 多人点赞 2017-12-15 09:29:21
    Android沉浸式状态栏(透明状态...为了提供更好的界面交互,google在Android4.4以后提供了设置沉浸式状态栏的方法,对于沉浸式状态栏这个名字存在争议,我们不做讨论,实际的效果其实就是透明的状态栏,然后在状态栏的位
  • android设置透明状态栏

    万次阅读 2020-05-21 18:23:17
    沉浸式状态栏:就是你看视频(横屏)的时候没有状态栏,就算你点击屏幕一下也不会出现状态栏的(需要从上屏幕边缘往下划一下才能出来状态栏),由于不好截屏这里我就不上图了,大家心领神会一下就行了。 透明式状态...
  •   1.在info.plist中添加View controller-based status bar appearance,值为NO ...2.在设置状态栏的地方添加代码 [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLi...
  • ios上状态栏 就是指的最上面的20像素高的部分 状态栏分前后两部分,要分清这两个概念,后面会用到: 前景部分:就是指的显示电池、时间等部分; 背景部分:就是显示黑色或者图片的背景部分; (一)设置statusBar...
1 2 3 4 5 ... 20
收藏数 291,299
精华内容 116,519
关键字:

状态栏设置