本課程將說明如何在不同 Android 版本上隱藏狀態列。隱藏狀態列 (並視需要顯示導覽列) 可讓內容使用更多顯示空間,進而提供更身歷其境的使用者體驗。
圖 1 顯示顯示狀態列的應用程式:
圖 2 顯示含有隱藏狀態列的應用程式。請注意,系統也會隱藏動作列。不應在沒有狀態列的情況下顯示動作列。
在 Android 4.0 以下版本隱藏狀態列
您可以在 Android 4.0 (API 級別 14) 以下版本中設定 WindowManager
旗標,藉此隱藏狀態列。您可以透過程式輔助的方式,或是在應用程式的資訊清單檔案中設定活動主題。如果應用程式狀態列應一律隱藏,則建議您在應用程式的資訊清單檔案中設定活動主題 (不過,如有需要,您也可以透過程式輔助方式覆寫主題)。例如:
<application ... android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" > ... </application>
使用活動主題的優點如下:
- 相較於以程式輔助方式設定標記,維護起來較為簡單,也較不容易出錯。
- 這會導致 UI 轉換更加流暢,因為在將應用程式的主要活動例項化之前,系統已取得轉譯 UI 所需的資訊。
或者,您也可以透過程式輔助方式設定 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
旗標時,標記仍會生效。
您可以使用 FLAG_LAYOUT_IN_SCREEN
來設定活動版面配置,使用啟用 FLAG_FULLSCREEN
後可用的同一個螢幕區域。這可防止在狀態列隱藏及顯示時,調整內容大小。
在 Android 4.1 以上版本中隱藏狀態列
您可以使用 setSystemUiVisibility()
在 Android 4.1 (API 級別 16) 以上版本中隱藏狀態列。setSystemUiVisibility()
可設定個別檢視畫面層級的 UI 旗標;這些設定會匯總為視窗層級。相較於使用 WindowManager
旗標,使用 setSystemUiVisibility()
設定 UI 旗標可讓您更精細地控管系統資訊列。這段程式碼會隱藏狀態列:
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();
請注意:
- 清除 UI 旗標後 (例如從活動離開),如要再次隱藏長條,應用程式需要重設標記。請參閱「回應 UI 瀏覽權限變更」的討論,瞭解如何監聽 UI 瀏覽權限變更,以便應用程式做出相應回應。
- 設定 UI 旗標的位置會有差異。如果在活動的
onCreate()
方法中隱藏系統資訊列,而且使用者按下主畫面按鈕,系統列就會重新顯示。使用者重新開啟活動時,系統不會呼叫onCreate()
,因此系統資訊列仍會顯示。如果您希望系統 UI 變更能在使用者來回瀏覽活動時保留,請在onResume()
或onWindowFocusChanged()
中設定 UI 標記。 - 只有在您呼叫其檢視畫面的檢視畫面會顯示時,
setSystemUiVisibility()
方法才會生效。 - 離開檢視畫面會導致系統清除使用
setSystemUiVisibility()
設定的標記。
讓內容顯示在狀態列後方
在 Android 4.1 以上版本中,您可以將應用程式的內容設定為在狀態列後方顯示,這樣內容就不會隨著狀態列隱藏和顯示而調整大小。方法是使用 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
。您可能也需要使用 SYSTEM_UI_FLAG_LAYOUT_STABLE
,協助應用程式維持穩定的版面配置。
使用這種方法時,您必須負責確保應用程式 UI 的重要部分 (例如 Google 地圖應用程式中的內建控制項) 不會被系統列遮住。這可能會導致應用程式無法使用。在多數情況下,只要在 XML 版面配置檔案中加入 android:fitsSystemWindows
屬性 (設為 true
),就能處理這種情況。這會調整父項 ViewGroup
的邊框間距,以便為系統視窗保留空間。對大多數應用程式而言,這樣的做法已足夠。
但在某些情況下,您可能需要修改預設邊框間距,才能取得應用程式所需的版面配置。如要直接操控內容與系統列相對的版面配置 (佔用視窗的「內容插邊」),請覆寫 fitSystemWindows(Rect insets)
。當視窗的內容插邊有所變更時,檢視區塊階層會呼叫 fitSystemWindows()
方法,以便視窗據此調整內容。覆寫此方法即可視需要處理插邊 (進而影響應用程式的版面配置)。