本课介绍如何隐藏不同版本的
Android。通过隐藏状态栏(也可选择隐藏导航栏),
内容会占用更多的显示空间,从而提供沉浸感更强的用户体验。
图 1 显示了具有可见状态栏的应用:
图 1. 状态栏可见。
图 2 显示了状态栏已隐藏的应用。请注意,操作栏也会隐藏。
切勿在没有状态栏的情况下显示操作栏。
图 2. 状态栏隐藏。
在 Android 4.0 及更低版本中隐藏状态栏
在 Android 4.0(API 级别 14)及更低版本上,您可以通过将状态栏设置为
WindowManager 标志。您可以通过编程方式或通过
在应用的清单文件中设置 activity 主题。在应用的
如果状态栏应始终保持
(但严格来说,您可以通过编程方式替换
主题)。例如:
... android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" > ...
使用 Activity 主题背景的优势如下:
与通过编程方式设置标志相比,更易于维护且不易出错。
这会使界面过渡更顺畅,因为系统拥有所需的信息
先呈现界面,然后再实例化应用的主 activity。
或者,您可以通过编程方式设置 WindowManager 标志。
此方法可在用户与以下应用互动时更轻松地隐藏和显示状态栏
您的应用:
Kotlin
class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
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) {
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN)
}
setContentView(R.layout.activity_main)
}
...
}
Java
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 标志时(无论是通过 activity 主题还是
则标志将保持有效,除非您的应用将其清除。
您可以使用
FLAG_LAYOUT_IN_SCREEN
将 activity 布局设为使用与启用
FLAG_FULLSCREEN。这样可以防止您的
禁止在状态栏隐藏和显示时调整大小。
在 Android 4.1 及更高版本中隐藏状态栏
在 Android 4.1(API 级别 16)及更高版本中,您可以隐藏状态栏,方法是
使用 setSystemUiVisibility()。
setSystemUiVisibility() 将界面标志设置为
单个视图级别这些设置会汇总到窗口级别。使用
setSystemUiVisibility(),用于设置界面标志
与使用 Google Kubernetes Engine 时
WindowManager 标志。以下代码段会隐藏状态栏:
Kotlin
// Hide the status bar.
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN
// Remember that you should never show the action bar if the
// status bar is hidden, so hide that too if necessary.
actionBar?.hide()
Java
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();
请注意以下几点:
清除界面标记后(例如,离开
activity),那么如果您要再次隐藏这些栏,您的应用需要重置这些栏。
请参阅响应界面可见性更改,了解
讨论如何监听界面可见性更改,以便您的应用
做出相应的响应。
在不同的位置设置界面标记会产生不同的效果。如果您将系统栏隐藏在 activity 的
onCreate() 方法且用户按主屏幕按钮时,系统栏将
重新出现。当用户重新打开 activity 时,onCreate()
因此系统栏会一直显示如果您希望系统界面
会在用户进入和离开 activity 时保持不变,请在
onResume()
或 onWindowFocusChanged()。
setSystemUiVisibility() 方法
只有在您从中调用它的视图可见时才有效。
离开视图会导致标志
使用“setSystemUiVisibility()”设置
待清除。
让内容显示在状态栏后面
在 Android 4.1 及更高版本中,您可以将应用的内容设置为显示在后面
这样,内容就不会随着状态栏的隐藏和显示调整大小。
为此,请使用
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN。
您可能还需要使用
SYSTEM_UI_FLAG_LAYOUT_STABLE 来帮助您的应用保持
稳定的布局。
使用此方法时,您有责任确保关键部分
(例如,地图应用中的内置控件)
被系统栏覆盖否则会导致您的应用无法使用。在大多数情况下,您可以
具体做法是,向 XML 布局文件添加 android:fitsSystemWindows 属性,将其设为
true。这会调整父级 ViewGroup 的内边距
为系统窗口留出空间这对于大多数应用来说已经足够。
但在某些情况下,您可能需要修改默认内边距,以获得所需的
应用布局要直接控制
内容的布局方式是相对于系统栏
"content insets"),请替换 fitSystemWindows(Rect insets)。
fitSystemWindows() 方法是由
视图层次结构,以允许窗口
并据此调整其内容。通过重写此方法,您可以处理
边衬区(也就是应用的布局)。