状态栏_状态栏设置 - CSDN
精华内容
参与话题
  • Android状态栏微技巧,带你真正理解沉浸式模式

    万次阅读 多人点赞 2017-04-16 16:44:40
    记得之前有朋友在留言里让我写一篇关于沉浸式状态栏的文章,正巧我确实有这个打算,那么本篇就给大家带来一次沉浸式状态栏的微技巧讲解。 其实说到沉浸式状态栏这个名字我也是感到很无奈,真不知道这种叫法是谁先...

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/51763825

    本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每天都有文章更新。

    记得之前有朋友在留言里让我写一篇关于沉浸式状态栏的文章,正巧我确实有这个打算,那么本篇就给大家带来一次沉浸式状态栏的微技巧讲解。

    其实说到沉浸式状态栏这个名字我也是感到很无奈,真不知道这种叫法是谁先发起的。因为Android官方从来没有给出过沉浸式状态栏这样的命名,只有沉浸式模式(Immersive Mode)这种说法。而有些人在没有完全了解清楚沉浸模式到底是什么东西的情况下,就张冠李戴地认为一些系统提供的状态栏操作就是沉浸式的,并且还起了一个沉浸式状态栏的名字。

    比如之前就有一个QQ群友问过我,像饿了么这样的沉浸式状态栏效果该如何实现?

    这个效果其实就是让背景图片可以利用系统状态栏的空间,从而能够让背景图和状态栏融为一体。

    本篇文章当中我会教大家如何实现这样的效果,但这个真的不叫沉浸式状态栏。因此,这算是一篇技术+普及的文章吧,讲技术的同时也纠正一下大家之前错误的叫法。

    什么是沉浸式?

    先来分析一下叫错的原因吧,之所以很多人会叫错,是因为根本就不了解沉浸式是什么意思,然后就人云亦云跟着叫了。那么沉浸式到底是什么意思呢?

    根据百度百科上的定义,沉浸式就是要给用户提供完全沉浸的体验,使用户有一种置身于虚拟世界之中的感觉。

    比如说现在大热的VR就是主打的沉浸式体验。

    那么对应到Android操作系统上面,怎样才算是沉浸式体验呢?这个可能在大多数情况下都是用不到的,不过在玩游戏或者看电影的时候就非常重要了。因为游戏或者影视类的应用都希望能让用户完全沉浸在其中,享受它们提供的娱乐内容,但如果这个时候在屏幕的上方还显示一个系统状态栏的话,可能就会让用户分分钟产生跳戏的感觉。

    那么我们来看一下比较好的游戏都是怎么实现的,比如说海岛奇兵:

    海岛奇兵的这种模式就是典型的沉浸式模式,它的整个屏幕中显示都是游戏的内容,没有状态栏也没有导航栏,用户玩游戏的时候就可以完全沉浸在游戏当中,而不会被一些系统的界面元素所打扰。

    然后我们再来看一下爱奇艺的实现:

    同样也是类似的,爱奇艺将整个屏幕作为影视的展示区,用户在看电影的时候眼中就只会有电影的内容,这样就不会被其他一些无关的东西所分心。

    这才是沉浸式模式的真正含义,而所谓的什么沉浸式状态栏纯粹就是在瞎叫,完全都没搞懂“沉浸式” 这三个字是什么意思。

    不过虽然听上去好像是很高大上的沉浸式效果,实际看上去貌似就是将内容全屏化了而已嘛。没错,Android沉浸式模式的本质就是全屏化,不过我们今天的内容并不仅限于此,因为还要实现饿了么那样的状态栏效果。那么下面我们就开始来一步步学习吧。

    隐藏状态栏

    一个Android应用程序的界面上其实是有很多系统元素的,观察下图:

    可以看到,有状态栏、ActionBar、导航栏等。而打造沉浸式模式的用户体验,就是要将这些系统元素全部隐藏,只留下主体内容部分。

    比如说我现在新建了一个空项目,然后修改布局文件中的代码,在里面加入一个ImageView,如下所示:

    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@drawable/bg"
            android:scaleType="centerCrop" />
    
    </RelativeLayout>

    这里将ImageView的宽和高都设置成match_parent,让图片充满屏幕。现在运行一下程序,效果如下图所示。

    如果你将图片理解成游戏或者电影界面的话,那这个体验离沉浸式就差得太远了,至少状态栏和ActionBar得要隐藏起来了吧?没关系,我们一步步进行优化,并且在优化中学习。

    隐藏状态栏和ActionBar的方式在4.1系统之上和4.1系统之下还是不一样的,这里我就不准备考虑4.1系统之下的兼容性了,因为过于老的系统根本就没有提供沉浸式体验的支持。

    修改MainActivity中的代码,如下所示:

    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            View decorView = getWindow().getDecorView();
            int option = View.SYSTEM_UI_FLAG_FULLSCREEN;
            decorView.setSystemUiVisibility(option);
            ActionBar actionBar = getSupportActionBar();
            actionBar.hide();
        }
    }

    这里先调用getWindow().getDecorView()方法获取到了当前界面的DecorView,然后调用它的setSystemUiVisibility()方法来设置系统UI元素的可见性。其中,SYSTEM_UI_FLAG_FULLSCREEN表示全屏的意思,也就是会将状态栏隐藏。另外,根据Android的设计建议,ActionBar是不应该独立于状态栏而单独显示的,因此状态栏如果隐藏了,我们同时也需要调用ActionBar的hide()方法将ActionBar也进行隐藏。

    现在重新运行一下程序,效果如下图所示。

    这样看上去就有点沉浸式效果的模样了。

    虽说这才是正统的沉浸式含义,但有些朋友可能想实现的就是饿了么那样的状态栏效果,而不是直接把整个系统状态栏给隐藏掉,那么又该如何实现呢?

    其实也很简单,只需要借助另外一种UI Flag就可以了,如下所示:

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (Build.VERSION.SDK_INT >= 21) {
        View decorView = getWindow().getDecorView();
        int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
        decorView.setSystemUiVisibility(option);
        getWindow().setStatusBarColor(Color.TRANSPARENT);
    }
    ActionBar actionBar = getSupportActionBar();
    actionBar.hide();

    首先需要注意,饿了么这样的效果是只有5.0及以上系统才支持,因此这里先进行了一层if判断,只有系统版本大于或等于5.0的时候才会执行下面的代码。

    接下来我们使用了SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN和SYSTEM_UI_FLAG_LAYOUT_STABLE,注意两个Flag必须要结合在一起使用,表示会让应用的主体内容占用系统状态栏的空间,最后再调用Window的setStatusBarColor()方法将状态栏设置成透明色就可以了。

    现在重新运行一下代码,效果如下图所示。

    可以看到,类似于饿了么的状态栏效果就成功实现了。

    再声明一次,这种效果不叫沉浸式状态栏,也完全没有沉浸式状态栏这种说法,我们估且可以把它叫做透明状态栏效果吧。

    隐藏导航栏

    现在我们已经成功实现隐藏状态栏的效果了,不过屏幕下方的导航栏还比较刺眼,接下来我们就学习一下如何将导航栏也进行隐藏。

    其实实现的原理都是一样的,隐藏导航栏也就是使用了不同的UI Flag而已,修改MainActivity中的代码,如下所示:

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    View decorView = getWindow().getDecorView();
    int option = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_FULLSCREEN;
    decorView.setSystemUiVisibility(option);
    ActionBar actionBar = getSupportActionBar();
    actionBar.hide();

    这里我们同时使用了SYSTEM_UI_FLAG_HIDE_NAVIGATION和SYSTEM_UI_FLAG_FULLSCREEN,这样就可以将状态栏和导航栏同时隐藏了。现在重新运行一下程序,效果如图所示。

    这次看上去好像终于是完全全屏化了,但其实上这离真正的沉浸式模式还差得比较远,因为在这种模式下,我们触摸屏幕的任意位置都会退出全屏。

    这显然不是我们想要的效果,因此这种模式的使用场景比较有限。

    除了隐藏导航栏之外,我们同样也可以实现和刚才透明状态栏类似的效果,制作一个透明导航栏:

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (Build.VERSION.SDK_INT >= 21) {
        View decorView = getWindow().getDecorView();
        int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
        decorView.setSystemUiVisibility(option);
        getWindow().setNavigationBarColor(Color.TRANSPARENT);
        getWindow().setStatusBarColor(Color.TRANSPARENT);
    }
    ActionBar actionBar = getSupportActionBar();
    actionBar.hide();

    这里使用了SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION,表示会让应用的主体内容占用系统导航栏的空间,然后又调用了setNavigationBarColor()方法将导航栏设置成透明色。现在重新运行一下程序,效果如下图所示。

    真正的沉浸式模式

    虽说沉浸式导航栏这个东西是被很多人误叫的一种称呼,但沉浸式模式的确是存在的。那么我们如何才能实现像海岛奇兵以及爱奇艺那样的沉浸式模式呢?

    首先你应该确定自己是否真的需要这个功能,因为除了像游戏或者视频软件这类特殊的应用,大多数的应用程序都是用不到沉浸式模式的。

    当你确定要使用沉浸式模式,那么只需要重写Activity的onWindowFocusChanged()方法,然后加入如下逻辑即可:

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        @Override
        public void onWindowFocusChanged(boolean hasFocus) {
            super.onWindowFocusChanged(hasFocus);
            if (hasFocus && Build.VERSION.SDK_INT >= 19) {
                View decorView = getWindow().getDecorView();
                decorView.setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
            }
        }
    
    }

    沉浸式模式的UI Flag就这些,也没什么好解释的,如果你需要实现沉浸式模式,直接将上面的代码复制过去就行了。需要注意的是,只有在Android 4.4及以上系统才支持沉浸式模式,因此这里也是加入了if判断。

    另外,为了让我们的界面看上去更像是游戏,这里我将MainActivity设置成了横屏模式:

    <activity android:name=".MainActivity" 
              android:screenOrientation="landscape">
        ...
    </activity>

    这样我们就实现类似于海岛奇兵和爱奇艺的沉浸式模式效果了,如下图所示。

    可以看到,界面默认情况下是全屏的,状态栏和导航栏都不会显示。而当我们需要用到状态栏或导航栏时,只需要在屏幕顶部向下拉,或者在屏幕右侧向左拉,状态栏和导航栏就会显示出来,此时界面上任何元素的显示或大小都不会受影响。过一段时间后如果没有任何操作,状态栏和导航栏又会自动隐藏起来,重新回到全屏状态。

    这就是最标准的沉浸式模式。


    关注我的技术公众号,每天都有优质技术文章推送。关注我的娱乐公众号,工作、学习累了的时候放松一下自己。

    微信扫一扫下方二维码即可关注:

    20160507110203928         20161011100137978

    展开全文
  • 1.首先在xml布局中对于每一个部分都加上 android:fitsSystemWindows="true" 2.在res中->New->Directory,创建一个values-v21目录,在目录中New一个Values resource file,创建一个styles.xml ...
    在活动的onCreate中添加
    getWindow().setStatusBarColor(Color.TRANSPARENT);
            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
            

    如果单纯只是想改变状态栏颜色

    就把color.xml中的colorPrimary改成你的主题色

    
     
    展开全文
  • 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-15 18:45:43
    状态栏窗口既不接受用户输入也不产生命令消息,它的作用就是在程序的控制下在窗格中显示一些文本。状态栏可支持两种类型的文本窗口——信息行窗口和状态指示器窗格。为了能够在状态栏中显示一些应用程序的特殊数据,...

    状态栏窗口既不接受用户输入也不产生命令消息,它的作用就是在程序的控制下在窗格中显示一些文本。状态栏可支持两种类型的文本窗口——信息行窗口和状态指示器窗格。为了能够在状态栏中显示一些应用程序的特殊数据,我们必须首先禁止标准状态栏显示菜单提示及键盘状态。
    3.3.1 状态栏的定义
    应用程序在MainFrm.cpp文件中所产生的静态indicator数组就是用来定义状态栏的,其中ID_SEPARATOR 是用标识信息行窗格的,菜单项或工具按钮的许多信息都在这个信息行窗格中显示,而其他一些常量则是一些字符串资源的ID,它们是用来标识指示器窗格的,分别显示出CapsLock、NumLock 和ScrollLock 这三个键的状态。图3-18 列出了indicator 数组及它与标准状态栏的关系。

    3.3.2 状态栏的常用操作
    1、增加和减少窗格状态栏中的窗格可以分为信息行窗格和指示器窗格两类。若在状态栏中增加一个信息行窗格,则只需要在indicators数组中的适当位置中增加一个ID_SEPARTOR标识即可。
    若在状态栏中增加一个用户指示器窗格,则在indicator 数组中的适当位置增加一个在字符串表中定义过的资源ID,其字符串的长度表示用户指示器窗格的大小。若状态栏减
    少一个窗格,其操作与增加相类似,只需减少indicators 数组元素即可。
    2、在状态栏上显示文本有三种办法可以在状态栏窗格显示文本信息:
    (1)调用CWnd::SetWindowText 更新信息行窗格(或窗格0)中的文本。由于状态栏也是一种窗口,故在使用时可直接调用。若状态栏变量为m_wndStatusBar,则m_wndStatusBar.SetWindowsText(“消息”)语句将在信息行窗格(或窗格0)内显示“消息”字样。
    (2)手动处理状态栏的ON_UPDATE_COMMAND_UI 更新消息,并在处理函数中调用CcmdUI ::SetText 函数。
    (3)调用CStatusBar::SetPaneText 函数更新任何窗格(包括信息行窗格)中的文本。此函数原型描述如下:
    Bool SetPaneText(int nIndex,LPCTSTR lpszNewText,BOOL bUpdate=TRUE) ;
    其中,lpszNewText表示要显示的字符串。nIndex是表示设置的窗格索引(第一个窗格的索引为0)。若bUpdate为TRUE,则系统自动更新显示的结果。
    3、改变状态栏的风格
    在CstatusBar类中,有两个成员函数可以改变状态栏风格,它们是:
    void SetPaneInfo(int nIndex,UNIT nID,UNIT nStyle,int cxWidth) ;
    void SetPaneStyle(int nIndex,UNIT nStyle) ;
    其中,参数nIndex表示要设置的状态栏窗格的索引,nID用来为状态窗格指定新的ID,cxWidth表示窗格的像素宽度,nStyle表示窗格的风格类型,用来指定窗格的外观,例如SBPS_POPOUT表示窗格是凸起来的。
    3.3.3 状态栏示例程序StatusBar
    应用程序StatusBar用一个新的状态栏对标准应用程序框架状态栏进行了替换。新的状态栏包含了如下一些文本窗格:

    程序StatusBar的最终运行结果如图3-19所示。我们可以按以下步骤来创建StatusBar应用程序:

    1、运行应用程序向导来生成MFC 项目StatusBar。在该应用程序生成过程中,除下面两项:选择“单文档类型”,取消“打印和打印预览支持”,其余所有选项接受默认值。
    2、利用字符串编辑器编辑应用程序的字符串表资源,增加两个字符串资源。在资源视图选项卡上的“String Table”图标上双击可进入字符串编辑器,然后在列表的最后的空项上双击,此时弹出一个对话框,允许我们指定ID 和字符串值,如图3-20 所示 。加入如下两个字符串:

    3、编辑应用程序的符号。从【编辑】菜单里选择【资源符号...】,加入新的状态栏标识符ID_MY_STATUS_BAR,接受其默认值。
    4、利用属性窗口的“事件”标签为CMainFrame 类中加入【视图】菜单下的菜单项【状态栏】命令控制函数。请加入下表所示的命令消息控制函数:

    5、在MainFrm.h 中加入如下的函数原型声明:
    添加的字符串
    Afx_msg void OnUpdateLeft(CCmdUI *pCmdUI);
    Afx_msg void OnUpdateRight(CcmdUI *pCmdUI) ;
    注意:以上的消息控制函数声明语句必须加在AFX_MSG括弧对之间。
    另外,在MainFrm.h打开的同时,使m_wndStatusBar为公有(public)而不是保护(protected)。
    6、编辑MainFrm.cpp文件。请用如下粗体和黑体的代码替代原来的indicator数组:
    static UINT indicators[] =
    {
    ID_SEPARATOR, // 状态行指示器
    ID_SEPARATOR,
    ID_INDICATOR_LEFT,
    ID_INDICATOR_RIGHT,
    };
    然后,再对OnCreate成员函数进行编辑。请把下面的语句:
    if (!m_wndStatusBar.Create(this) ||
    !m_wndStatusBar.SetIndicators(indicators,
    sizeof(indicators)/sizeof(UINT)))
    {
    TRACE0("未能创建状态栏\n");
    return -1; // 未能创建
    }
    替换成下面的语句:
    if (!m_wndStatusBar.Create(this,WS_CHILD|WS_VISIBLE|CBRS_BOTTOM,ID_MY_STATUS_BAR) //修改增加的代码
    || !m_wndStatusBar.SetIndicators(indicators,
    sizeof(indicators)/sizeof(UINT)))
    {
    TRACE0("未能创建状态栏\n");
    return -1; // 未能创建
    }
    在这里我们对Create调用进行了修改,用我们自己定义的状态栏ID:ID_MY_STATUS_BAR代替了AFX_IDW_STATUS_BAR(它标识了应用程序框架的状态栏对象)。
    下面需要为类CMainFrame加进如下的消息映射入口。
    //mainfrm.cpp
    BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
    ON_UPDATE_COMMAND_UI(ID_INDICATOE_LEFT,OnUpdateLeft) //消息映射宏
    ON_UPDATE_COMMAND_UI(ID_INDICATOE_RIGHT, OnUpdateRight)
    END_MESSAGE_MAP()
    接着需要加入如下的CmainFrame成员函数,它们用来对两个状态栏指示器进行更新:
    void CMainFrame ::OnUpdateLeft(CCmdUI *pCmdUI) //函数体
    {
    pCmdUI->Enable( ::GetKeyState(VK_LBUTTON)<0) ;
    }
    void CMainFrame ::OnUpdateRight(CCmdUI *pCmdUI) //函数体
    {
    pCmdUI->Enable( ::GetKeyState(VK_RBUTTON)<0) ;
    }
    最后,还要在MainFrame.cpp文件中,对已经生成的【视图】菜单下的菜单命令【状态栏】的响应函数和界面更新函数进行编辑:
    void CMainFrame ::OnViewStatusBar()
    {
    m_wndStatusBar.ShowWindow((m_wndStatusBar.GetStyle() &
    WS_VISIBLE)== 0) ;
    Recalclayout() ;
    }
    void CMainFrame ::OnUpdateViewStatusBar(CCmdUI *pCmdUI)
    {
    pCmdUI->SetCheck((m_wndStatusBar.GetStyle() & WS_VISIBLE) != 0) ;
    }
    这些函数保证了【视图】菜单下的【状态栏】命令能被恰当地连接进新的状态栏。
    7、在视图类中加入WM_MOUSEMOVE消息控制函数,并按如下代码编辑该函数。该函数先获得状态栏对象的指针,然后调用SetPaneText函数更新第一和第二信息行窗格。
    void CstatusBarView::OnMouseMove(UNIT nFlags,Cpoint point)
    {
    CString str ;
    CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd ;
    CStatusBar *pStatus= &pFrame->m_wndStatusBar ;
    if (pStatus) {
    str.Format(“X= %d”,point.x) ;
    pStatus->SetPaneText(0,str) ;
    str.Format(“Y= %d”,point.y) ;
    pStatus->SetPaneText(1,str) ;
    }
    }
    最后将语句:#include “MainFrm.h”加在文件StatuaBarView.cpp靠近最上面的地方。
    8、对文件StatuaBarView.cpp中的OnDraw函数进行编辑。OnDraw函数用来在视图窗口中显示一条提示信息。请加入下面粗斜体的代码:
    void CStatusBar ::OnDraw(CDC *pDC(
    {
    pDC->TextOut(0,0, “移动鼠标并按鼠标按钮,观察状态栏!”) ;
    }
    9、编译并测试StatusBar应用程序。请移动鼠标,观察一下左边的两个窗格中是否准确地反映了鼠标指针的位置。然后再试一试左右鼠标按钮,此时能否通过【视图】菜单的【状态栏】命令对状态栏进行允许和禁止切换?
    说明:如果希望第一(索引值为0)状态格能像其他窗格一样具有立体边框,以使状态栏看起来更好看,可以在CMainFrame类的OnCreate函数中加入如下代码行,但必须把它加在对状态栏的Create函数调用之后。
    m_wndStatusBar.SetPaneInfo(0,0,0,50) ;
    m_wndStatusBar.SetPaneInfo(1,0,SBPS_STRETCH,50) ;
    这些语句改变了前面两个窗格的宽度(不再是默认的1/4显示屏尺寸),并使第二个窗格(索引为1)成为了可伸缩的。

     

    展开全文
  • 本篇实现的是沉浸式状态栏。 其实,实质上就是使手机状态栏的颜色改变,使其成为自己想要的颜色。如果把它设置成和APP主色调相同,这样看上去就会好看许多。
  • 状态栏

    2020-07-22 14:43:16
    import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; import android.graphics.Color;...import android.os.Build;...import android.support.annotation.ColorInt;...
  • Android状态栏详解(全网最详)

    千次阅读 2020-05-11 08:38:12
  • Android沉浸式状态栏(透明状态栏)最佳实现

    万次阅读 多人点赞 2017-12-15 09:29:21
    Android沉浸式状态栏(透明状态栏)最佳实现 在Android4.4之前,我们的应用没法改变手机的状态栏颜色,当我们打开应用时,会出现上图中左侧的画面,在屏幕的顶部有一条黑色的状态栏,和应用的风格非常不协调;为了...
  • 今天总结一下状态栏的使用,当然也是参考别人的。但是总归自己得试试,然后把常用的几种情况记下来,因为这些东西是死的,下次拿过来就可以用。 一. 沉浸式状态栏 :Android 5.0以上才会支持沉浸式状态栏效果。 ...
  • 状态栏高度:20px,导航栏高度:40px,代码如下: [objc] view plain copy // (statusbar)  CGRect rectOfStatusbar = [[UIApplication sharedApplication] statusBarFrame];  NSLog(@"statusbar ...
  •  1.1 状态栏  状态栏展示于设备和当前环境相关的重要信息。  外观和行为:状态栏总是出现在屏幕顶部,包含网络连接、时间、电量等用户需要的信息  在iPhone上,状态栏的颜色会变。而在iPad上,状态栏总是黑色...
  • Android状态栏的颜色改变,希望在Android5.0以下也可实现对状态栏颜色的设置,我查资料用 Toolbar可对Android5.0的状态栏进行变色,但5.0以下没有效果,求大神科普啊
  • Android中系统状态栏的隐藏和显示

    万次阅读 2018-08-02 09:45:21
    尤其视频类APP,需要实现切换到横屏后,隐藏系统状态栏,全屏显示,以实现看更大画面的视频。当切换回竖屏后,又显示状态栏。那么如何实现呢?
  • iOS 隐藏顶部状态栏

    万次阅读 2015-11-06 15:17:45
    为了不影响app内容的显示,将顶部的状态栏(现实信号,时间,电量)隐藏 默认状态栏一直是存在的 方法一, 适用于修改某些页面的状态栏 我们可以通过设置ViewController的属性来隐藏 在 viewDidLoad 方法中添加...
  • 标题栏是手机左上最顶上,显示中国移动,安全卫士,或者当前运行软件的地方...右边显示信号,电量,网速等等是状态栏。下拉就会出现通知栏。 至于导航栏是手机最下面的返回,HOME,主页三个键,有些是一个按钮
  • android 系统状态栏的隐藏和显示

    万次阅读 多人点赞 2017-11-22 08:48:14
    系统状态栏的隐藏和显示。 昨天遇到这个问题,找了好久资料才解决,这里记录一下。 网上流传着很多种做法。比如: 1、在AndroidManifest.xml文件中修改theme为android:theme=”@android:style/Theme....
  • window用于设置小程序的状态栏、导航条、标题、窗口背景色。属性类型默认值描述最低版本navigationBarBackgroundColorHexColor#000000导航栏背景颜色,如"#000000" navigationBarTextStyleStringwhite...
  • Android获取状态栏高度

    万次阅读 2018-05-21 10:43:53
    布局文件 &amp;amp;lt;Button android:id=&amp;quot;@+id/btn_getStatebar&amp;quot; android:layout_width=&amp;quot;wrap_content&amp;quot; android:layout_height=&... android:t
  • 沉浸式状态栏指的是,状态栏隐藏,在手指做了相关操作后,状态栏显示出来,例如视频播放器,在播放视频时是隐藏状态栏的,但是点击屏幕的时候,状态栏会显示出来,再例如文本阅读器,在阅读的时候是全屏的,然后从...
  • virtualBox菜单栏和状态栏显示

    万次阅读 2015-11-03 22:45:27
    菜单栏和状态栏不小心隐藏 带来操作不便的蛋疼问题。。。。。。。。。。。。 VirtualBox设有热键,也就是home健和右Ctrl键。 如果你也不小心隐藏了菜单,你可以这样解决。 同时按 右Ctrl健和home会出现...
1 2 3 4 5 ... 20
收藏数 386,617
精华内容 154,646
关键字:

状态栏