隱藏狀態列

本課程將說明如何在不同 Android 版本上隱藏狀態列。隱藏狀態列 (並視需要顯示導覽列) 可讓內容使用更多顯示空間,進而提供更身歷其境的使用者體驗。

圖 1 顯示顯示狀態列的應用程式:

系統列

圖 1 顯示狀態列。

圖 2 顯示含有隱藏狀態列的應用程式。請注意,系統也會隱藏動作列。不應在沒有狀態列的情況下顯示動作列。

系統列

圖 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() 方法,以便視窗據此調整內容。覆寫此方法即可視需要處理插邊 (進而影響應用程式的版面配置)。