官网: http://developer.android.com/intl/zh-cn/training/system-ui/index.html
System Bars 包括:顶部的状态栏和底部的导航栏(status and navigation bars) 声明:调节status and navigation bars 要求系统版本 >4.0。目前android 不支持=<4.0的版本。
隐藏status and navigation bars 同过设置一个flag来实现: SYSTEM_UI_FLAG_LOW_PROFILE。
// This example uses decor view, but you can use any visible view.
View decorView = getActivity().getWindow().getDecorView();
int uiOptions =View.SYSTEM_UI_FLAG_LOW_PROFILE;
decorView
.setSystemUiVisibility(uiOptions);
显示status and navigation bars
View decorView = getActivity().getWindow().getDecorView();
// Calling setSystemUiVisibility() with a value of 0 clears
// all flags.
decorView
.setSystemUiVisibility(0);
当用户触摸到status and navigation bars,flag会被清除,会使状态栏和导航栏显示。一旦flag被清除,若果你想再次隐藏,你需要重新设置。

隐藏状态栏 不同的android版本,隐藏的方法不尽相同。
1.隐藏状态栏(<=4.0版本) 通过设置主题的方法: XML里设置:
<application
...
android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen">
...
</application>

代码设置:
publicclassMainActivityextendsActivity{

@Override
protectedvoid 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);
}
...
}

2.设置状态栏(>=4.1版本) 通过代码设置:
View decorView = getWindow().getDecorView();
// Hide the status bar.
int uiOptions =View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView
.setSystemUiVisibility(uiOptions);
// Remember that you should never show the action bar if the
// status bar is hidden, so hide that too if necessary.
ActionBar actionBar = getActionBar();
actionBar
.hide();
但是需要注意: · 一旦ui的flag被清除,如需隐藏,你需要重置。后面会介绍 UI Visibility Changes 对其进行监听。 · 你在哪里设置ui flag 有影响吗?如果你在 onCreate()方法中设置隐藏系统栏(状态栏和导航栏),那么当你按home键时,系统栏会重现。当你重回activity时,不会走onCreate()方法,所以系统栏不会隐藏。如果你想在重回activity时隐藏系统栏,请在onResume()或onWindowFocusChanged()方法中设置。 · 只有当 view在visible状态时,setSystemUiVisibility()才起作用。 · 导航栏离开view,会导致在setSystemUIVisibility()设置的flag被清除。
3.设置内容显示在状态栏后面
要求>=4.1版本。 设置flag SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN全屏
SYSTEM_UI_FLAG_LAYOUT_STABLE来帮助你的应用保持一个稳定的布局. 当你使用这个方法,它会要求你确定在你应用的UI的关键部分(比如,一个地图应用的内置控件)不会被系统栏覆盖。否则,这会导致应用崩溃。在大多数情况下,你要处理这种情况,需要在 在主题xml中设置 <item name = "android:fitsSystemWindows">true</item> 这是用来调整填充的父viewGroup给系统窗口留下空间。对于大多数应用来说是充分的。
4. status bar 与 action bar 同步、衔接 要求>=4.1版本。
为了避免改变你的布局的大小,当action bar显示隐藏时,你可以给action bar 启动覆盖模式。在覆盖模式时,你的activity布局会充满所有可用空间,好像action bar 不在这里并且系统绘制action bar 在你的布局的前面。这样会遮盖上层的布局,但是当action bar 显示或隐藏时,系统不需要改变你的布局的大小,并且过渡是无缝的。 action bar 开启覆盖模式,你需要自定义theme继承已存在的theme.添加一项: <item name = "android:windowActionBarOverlay">true</item> 然后,设置 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN ,如上描述,使你的activity布局用同样的可用的屏幕区域,当你已设置了SYSTEM_UI_FLAG_FULLSCREEN。当你想隐藏系统UI,用SYSTEM_UI_FLAG_FULLSCREEN。也会隐藏 action bar(因为windowActionBarOverlay=”true”)并且在隐藏和显示过程中伴有和谐的动画。
隐藏导航栏 导航栏是在android4.0(API level 14)引入的。
要求>=4.0版本。 通过设置flag : SYSTEM_UI_FLAG_HIDE_NAVIGATION
View decorView = getWindow().getDecorView();
// Hide both the navigation bar and the status bar.
// SYSTEM_UI_FLAG_FULLSCREEN is only available on Android 4.1 and higher, but as
// a general rule, you should design your app to hide the status bar whenever you
// hide the navigation bar.
int uiOptions =View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
|View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView
.setSystemUiVisibility(uiOptions);
需要注意的是: · 用这种方法,点击屏幕的任何地方都会引起系统栏(navigation and status bars)重现并保持可见。用户交互导致flags被清除。 · 一旦flags被清除,如果想重新隐藏,你需要重设flags。可通过UI Visibility Changes 监听变化。 · 你在哪里设置ui flag 有影响吗?如果你在 onCreate()方法中设置隐藏系统栏(状态栏和导航栏),那么当你按home键时,系统栏会重现。当你重回activity时,不会走onCreate()方法,所以系统栏不会隐藏。如果你想在重回activity时隐藏系统栏,请在onResume()或onWindowFocusChanged()方法中设置。 · 只有当 view在visible状态时,setSystemUiVisibility()才起作用。 · 导航栏离开view,会导致在setSystemUIVisibility()设置的flag被清除。
使内容出现在导航栏后面 要求版本>=4.1,你可以设置应用的内容出现在导航栏后面,这样,内容不会因为导航栏的显示或隐藏而改变大小。这样做需要使用 SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION .你还需要使用SYSTEM_UI_FLAG_LAYOUT_STABLE来使你的应用保持布局平稳。 当你使用这个方法,它要求你确定你的app的ui的关键部分不会被系统bars覆盖。需要在在主题xml中设置<item name = "android:fitsSystemWindows">true</item>
侵入式全屏模式(重点应用方法) android4.4引入一个新的flag: SYSTEM_UI_FLAG_IMMERSIVE 通过setSystemUiVisibility()设置,能让你的应用真的全屏。这个flag与SYSTEM_UI_FLAG_HIDE_NAVIGATIONSYSTEM_UI_FLAG_FULLSCREEN相比,隐藏系统栏并让应用捕获屏幕上的所有触摸事件。 当侵入式全屏模式被设置时,acitivity仍能接收所有触摸事件。用户通过在系统栏正常展现的地方向内滑动来显示系统栏。这回清除SYSTEM_UI_FLAG_HIDE_NAVIGATIONflag(和SYSTEM_UI_FLAG_FULLSCREENflag,如果使用了),所以系统栏会显示。如果设置了View.OnSystemUiVisibilityChangeListener,这会触发监听。当然,如果你不想系统栏过一会又自动隐藏,可以使用SYSTEM_UI_FLAG_IMMERSIVE_STICKYflag来代替。注意,“sticky”版本的flag不会触发监听,虽然系统栏会暂时显示在这个模式中。
1、非沉浸式模式。在进入沉浸式模式之前的显示。也是使用IMMERSIVEflag的显示,用户滑动来显示系统栏,从而清除SYSTEM_UI_FLAG_HIDE_NAVIGATIONSYSTEM_UI_FLAG_FULLSCREENflags。一旦flag被清除,系统栏重现并持续显示。 注意,这是系统栏ui保持同步的最好方式。(这里说一句,实践过程中,你会发现,status bar 和 nevigation bar不断的隐藏显示过程中,可能会使二者是不同步,也就是说,一个是隐藏状态,一个是显示状态。)。所有和status bar一起显示的ui控件,一旦应用进入沉浸式模式,ui控件和system bar 一起隐藏。为了确保你的ui和system bar 同步显示,需要合适的使用View.OnSystemUiVisibilityChangeListener来观察变化。稍后会介绍。 2、提示气泡。当应用第一次进入沉浸模式时,会弹出提示气泡,提示你如果显示system bar. 3、沉浸式模式。应用进入沉浸模式,system bar 和其他ui控件都隐藏。可以用IMMERSIVEIMMERSIVE_STICKY.来达到这种状态。 4、sticky flag。用IMMERSIVE_STICKYflag会显示这种UI,用户滑动来显示system bar ,暂时出现半透明栏然后再次隐藏。滑动的行为不会清除任何flags,也不会触发System UI Visibility Change Listener。注意,记住,“immersive”flags只有在你同时使用SYSTEM_UI_FLAG_HIDE_NAVIGATION,SYSTEM_UI_FLAG_FULLSCREEN, 或都有。但是通常是status bar 和 nevigation bar 都隐藏,当你想设置成“全沉浸”模式时。
使用 Non-Sticky Immersion
// This snippet hides the system bars.
private void hideSystemUI() {
// Set the IMMERSIVE flag.
// Set the content to appear under the system bars so that the content
// doesn't resize when the system bars hide and show.
mDecorView
.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 // hide nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE);
}

// This snippet shows the system bars. It does this by removing all the flags
// except for the ones that make the content appear under the system bars.
private void showSystemUI() {
mDecorView
.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}

使用 Sticky Immersion
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
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 Visibility Changes
View decorView = getWindow().getDecorView();
decorView
.setOnSystemUiVisibilityChangeListener
(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
// Note that system bars will only be "visible" if none of the
// LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.
if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
// TODO: The system bars are visible. Make any desired
// adjustments to your UI, such as showing the action bar or
// other navigational controls.
} else {
// TODO: The system bars are NOT visible. Make any desired
// adjustments to your UI, such as hiding the action bar or
// other navigational controls.
}
}
});


官网dome下载:http://download.csdn.net/detail/zrbcsdn/9277359

更多相关文章

  1. android 触发AppWidget上控件事件来更新AppWidget
  2. Android(安卓)setMovementMethod() 方法
  3. Android输入法的显示或隐藏
  4. 代码实现android手机信号监听
  5. Android(安卓)settings使用详解之设置优先网络
  6. android Button组件的属性和方法
  7. Android设置字体
  8. android textview 特出显示
  9. Android(安卓)显示Emoji表情字符

随机推荐

  1. Android的SoundPool
  2. Android(安卓)按键处理(驱动层到上层)架构
  3. Android(安卓)ContentProvider和Uri详解
  4. Android(安卓)音视频开发总结
  5. Android(安卓)更新UI的两种方法——handl
  6. TextView中ellipsize属性
  7. Android(安卓)中的图形图像的渲染
  8. Android消息处理机制
  9. android 选择本地图片并截剪图片保存到,sd
  10. Android(安卓)DataBinding的简单使用