写在前面

这是一篇译文,原文自Android developer的Hiding the Status Bar,文中图片大都来自此网站,外链也将会链到android dev。

但并不是完全翻译,为方便表述有修改,带私货

转载请表明原文出处:http://www.jianshu.com/p/e14ceff34f85

效果

展示状态栏

收起状态栏

注:如果你将状态栏收起了,那么在一般情况下也应该把action bar给收起来。

在Android 4.0 及以前的版本收起状态栏

在Android 4.0(API level 14)及以前,你可以使用 设置WindowManager flag来收起状态栏。有两种方法可以实现这个目的:设置manifest文件中activity的theme或者是代码动态设置。

1、设置manifest文件中设置activity的theme

当然了,如果你希望你的app持续着状态栏收起的状态的话,那么设置activity的theme是最好的,下面是一个小栗子:

...

android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" >

...

用这种方法的好处是显而易见的:

它更容易维护,且更难出错,因为它只修改了一处代码;

它能使UI过渡更平滑,因为在实例化你的activity以前系统就有了那些用于渲染UI的信息了;

2、代码动态修改WindowManager flag

直接上代码:

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// If the Android version is lower than Jellybean, use this call to hide

// the status bar.

if (Build.VERSION.SDK_INT < 16) {

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

}

setContentView(R.layout.activity_main);

}

...

}

一旦你设置了WindowManager flags以后,flags的作用就会持续到你清除这些flags为止。

当你已经enable了 FLAG_FULLSCREEN以后, 你还可以通过设置 FLAG_LAYOUT_IN_SCREEN 来让你的activity 的layout使用那些可用的相同区域。这样当状态栏展示或隐藏的时候,activity中的UI大小也不会发生变化。

在Android 4.1 及更高的版本收起状态栏

在Android 4.1 (API level 16)你可以使用setSystemUiVisibility()方法来收起状态栏,setSystemUiVisibility()方法会在view的层别上来设置UI flags;这些设置会聚合到window层别。对比设置WindowManage flag 来说,使用setSystemUiVisibility()方法来设置UI flags的话,可以使你拥有对System bar有更细颗粒的控制(我们在想在哪个Activity、什么时候收起状态栏都行)。同样举个小栗子:

View decorView = getWindow().getDecorView();

// 隐藏状态栏的核心代码

int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;

decorView.setSystemUiVisibility(uiOptions);

// 如果隐藏了状态栏的话,记得也隐藏actionBar

ActionBar actionBar = getActionBar();

if(actionBar != null){ //此判断为译者增加

actionBar.hide();

}

(附:你使用getActionBar获取ActionBar的话,有可能获取到一个null的ActionBar,因而为了安全,应该在hide操作之前验一下空)

注意事项:

一旦UI flags被clear掉了,你就应该重新设置这些flag。关于如何监听UI的可视化状态的改变,可参见Responding to UI Visibility Changes

你在不同的方法设置UI flags有可能导致不同的结果。如果你在activity的onCreate方法中设置UI flags的话,那么当你按下home键返回到桌面以后,那么状态栏就会重新出现,而当用户重新打开这个activity的时候,状态栏依旧显示。所以啊,如果你想用户回到这个activity的时候还是原来的隐藏状态栏的话,那么就应该在onResume()或者是onWindowFocusChanged()

在有你给出的view是可见的情况下,那该view调用setSystemUiVisibility()才是有效的(就是说调用这个方法的view必须是visible)

一旦一个view不在屏幕上了,那么在这个view上通过 setSystemUiVisibility()方法设置的flags都会被清除。(原文是Navigating away from the view causes flags set with setSystemUiVisibility() to be cleared.自行体会navigate away的意思,总感觉这个我翻译得不是很到位)

总结

那么根据上面的介绍,我们可以就写出两个静态方法了:

public static void hideStatusBar(Activity activity){

if (Build.VERSION.SDK_INT < 16) {

activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

}

else {

View decorView = activity.getWindow().getDecorView();

// Hide Status Bar.

int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;

decorView.setSystemUiVisibility(uiOptions);

}

}

public static void showStatusBar(Activity activity){

if (Build.VERSION.SDK_INT < 16) {

activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

}

else {

View decorView = activity.getWindow().getDecorView();

// Show Status Bar.

int uiOptions = View.SYSTEM_UI_FLAG_VISIBLE;

decorView.setSystemUiVisibility(uiOptions);

}

}

代码很简单,也很容易用,我就不写文档了。但是我没有按着官方建议收起Action Bar,各位可以根据自己的需求来决定是否收起Action Bar:

// 如果隐藏了状态栏的话,记得也隐藏actionBar

ActionBar actionBar = getActionBar();

if(actionBar != null){ //此判断为译者增加

actionBar.hide();

}

此外,也可以通过设置一个view的WindowManager flags来收起(/展示)状态栏:

view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN); //收起状态栏

view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); //展示状态栏

在状态栏的后面也设置内容

在Android 4.1 以后,你可以设置你app的内容展示到状态栏的后面,这样做的话,在状态栏被隐藏或展示以后,你的UI的大小也不会发生任何变化。为了达到这个目的,你可以使用 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN标签,同时你可能也需要 SYSTEM_UI_FLAG_LAYOUT_STABLE标签来使得你的app维持一个稳定的layout状态.

如果你需要使用上面的这个方案,那么你就应当确保app的主要部分不会被System bar给遮挡住。有两种方法

在大多数的情况下,你可以在你的XML layout文件中,将android:fitsSystemWindows属性设置为true。这样做可以调整父ViewGroup的padding,使之留出空位来放置system windows。这个做法在大部分情况下就已经足够了。

然而在小部分的情况下,你仍需要手动修改默认的padding来适应,这时候需要重写 fitSystemWindows(Rect insets)方法(然而这个方法在API 20就被弃用了),我们就可以相对于System bar控制我们的UI布局了。(关于这个方法详细情况,可参见官方文档,解释得非常清楚)

android怎么自动收起通知栏,Android中如何收起状态栏相关推荐

  1. android系统自动构建,[系统集成] Android 自动构建系统

    一.简介 android app 自动构建服务器用于自动下载app代码.自动打包.发布,要建立这样的服务器,关键要解决以下几个问题: 1. android app 自动化打包 android 的打包一 ...

  2. android app自动锁屏,Android开机自动启动app 不锁屏

    Android开机自动启动app 不锁屏 发布时间:2020-07-17 03:22:20 来源:51CTO 阅读:2086 作者:清水禅石 主要参考:http://life173.blog.51ct ...

  3. android 图片自动裁剪图片,Android图片选择到裁剪之步步深坑 – 简书

    我的问题已经解决,查阅了几十篇相关文章,换了数种解决方案,最终解决,虽然不是按照本文来的,但关闭窗口的时候发现本文算是系统,特此转载. 最近在自己的项目里实现了一个头像选择的功能,就是先从相册里选取一 ...

  4. Android Studio自动排版格式化(android排版和xml排版)

    Android Studio自动排版格式化 今天自己想让Android Studio软件自动格式化排版,结果搜了一下,都说是Ctrl + Alt + L 结果不行 后面自已经过网上一些提示和自己探索终 ...

  5. android程序自动卸载软件,Android应用静默安装和卸载

    App的静默安装和卸载 Android系统本身提供了安装卸载功能,但是api接口是@hide的,不是公开的接口,所以在应用级别 是无法实现静默安装和卸载的,要实现静默安装和卸载需要是系统应用,要有系统 ...

  6. android编程 自动裁剪图片,Android编程实现调用相册、相机及拍照后直接裁剪的方法...

    本文实例讲述了Android编程实现调用相册.相机及拍照后直接裁剪的方法.分享给大家供大家参考,具体如下: package com.cvte.health.phone; import java.io. ...

  7. android 大视图风格通知栏,Android中使用Notification实现宽视图通知栏(Notification示例二)...

    Notification是在你的应用常规界面以外展现的消息.当app让系统发送一个消息的时候,消息首先以图表的形式显示在通知栏.要查看消息的详情须要进入通知抽屉(notificationdrawer) ...

  8. android 市场自动安装软件,Android 应用中跳转到应用市场评分示例

    在开发Android App过程中,经常会遇见这样的功能.从当前的app跳转到一个应用商店并且跳转到自己app的详情页面,让用户给自己的App进行评分.评价,从而提高自己App的排名.下面介绍三种方法 ...

  9. android expandablelist 自动滚动,在ExpandableListView中,如何保留滚动位置_android_开发99编程知识库...

    在一些实验之后我做了一个满意的解决,它还保留了很好的滚动位置顶部可见项. 事实上,三种不同部分的信息需要保存和恢复: 状态( e .g列表. 其中组被展开),第一个可见项的索引和优良滚动位置. 不幸的 ...

最新文章

  1. 公开课 | 详解CNN-pFSMN模型以及在语音识别中的应用
  2. [LeetCode] 5. Longest Palindromic Substring
  3. 个人作业1——四则运算题目生成程序(基于控制台)
  4. 红茶一杯话Binder(传输机制篇_中)
  5. 使用Anaconda完全替代官方Python
  6. 大牛荐书 | 百度技术大牛都在读的7本书!
  7. mysql手工注入——盲注
  8. 关于计算机的英语演讲稿三分钟,以计算机为题的英语演讲稿5
  9. layUI table 内容超出宽度怎么换行显示,而不是显示省略号
  10. 互联网运营和传统运营,到底有什么区别
  11. 奶头乐理论和二八定律和马太效应
  12. 记录-vant-DatetimePicker时间选择器,时间选择滚动区域消失。[class*=van-hairline]
  13. 阿里云国际9款免费标签云生成工具
  14. How to get current full screen dimention and orientation in run time
  15. window电脑 休眠后无法唤醒 解决办法
  16. 无线路由频繁掉线9大原因分析
  17. 050002《马云说》读后感——勇者无畏
  18. 基于RFID技术下的化工厂定位系统,包含化工厂人员定位解决方案-新导智能
  19. sourcetree的使用方法
  20. 单身程序员的福利!快来加入全国最大的硕博交友群,手慢无!

热门文章

  1. 第4章 Python 数字图像处理(DIP) - 频率域滤波8 - 二维DFT和IDFT的一些性质 - 二维离散卷积定理
  2. python for android教程-Python for Android,将你的Python应用打包为APK文件
  3. 一个端口可以和多个远程端口通信
  4. VC中的*.aps,*.ncb.*.opt文件分别是做什么用的???
  5. java 正则常用的几个方法
  6. 【Android 进阶】Dagger2 系列:入门案例一
  7. import skimage报错ImportError: numpy.core.multiarray failed to import解决
  8. 今日新加坡元兑泰铢汇率
  9. 【转】数据库基本知识:(五)视图应用
  10. C# Panel滚动条初始化位置