本课介绍了如何在不同版本的 Android 上隐藏状态栏。隐藏状态栏(也可选择隐藏导航栏)可让内容使用更多显示空间,从而提供更加身临其境的用户体验。
图 1 显示了具有可见状态栏的应用:
图 2 显示了状态栏已隐藏的应用。请注意,操作栏也会处于隐藏状态。 切勿在没有状态栏的情况下显示操作栏。
在 Android 4.0 及更低版本中隐藏状态栏
您可以通过设置 WindowManager
标志在 Android 4.0(API 级别 14)及更低版本上隐藏状态栏。您可以通过编程方式执行此操作,也可以在应用的清单文件中设置 activity 主题。如果状态栏应始终在应用中保持隐藏,则首选方法是在应用的清单文件中设置 activity 主题(但严格来说,如果您愿意,可以通过编程方式替换该主题)。例如:
<application ... android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" > ... </application>
使用 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()
在单个视图级别设置界面标志;这些设置会汇总到窗口级别。与使用 WindowManager
标志相比,使用 setSystemUiVisibility()
设置界面标志可让您更精细地控制系统栏。以下代码段会隐藏状态栏:
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
的内边距,为系统窗口留出空间。这对于大多数应用来说已经足够。
不过,在某些情况下,您可能需要修改默认内边距,以获得应用所需的布局。如需直接操纵内容相对于系统栏(占用空间,称为窗口“内容边衬区”)的布局方式,请替换 fitSystemWindows(Rect insets)
。当窗口的内容边衬区发生更改时,视图层次结构会调用 fitSystemWindows()
方法,以便窗口相应地调整其内容。通过替换此方法,您可以根据需要处理边衬区(以及应用的布局)。