切換語言為:簡體

用WindowInsetsControllerCompat方便的顯示和隱藏狀態列和導航欄

  • 爱糖宝
  • 2024-08-13
  • 2094
  • 0
  • 0

WindowInsetsControllerCompat 是 Android 中的一個類,用於更方便地處理和控制視窗插入 (Window Insets),例如狀態列和導航欄的顯示和隱藏。這個類是 Android 檢視系統的一部分,提供了對視窗內嵌元素的更現代和靈活的控制方法。

這是一個位於 androidx.core.view 包中的類,旨在增強對不同 Android 版本的相容性。它簡化了在不同 API 級別上控制系統視窗插入的複雜性,使得開發者能夠更輕鬆地處理狀態列和導航欄的顯示/隱藏、動畫過渡等操作。

主要功能

1、 顯示和隱藏狀態列、導航欄: 使用 WindowInsetsControllerCompat,你可以輕鬆地控制狀態列和導航欄的顯示與隱藏。

2、 控制系統視窗的行為: 你可以控制系統視窗的行為模式,例如 BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE,允許使用者透過滑動手勢臨時顯示系統欄。

3、 設定系統視窗插入的樣式: 例如,可以設定狀態列和導航欄的亮色或暗色(淺色主題下的深色文字和圖示,或者深色主題下的淺色文字和圖示)。

程式碼示例

下面透過 Kotlin 程式碼示例展示如何使用 WindowInsetsControllerCompat 來實現上述功能。

初始化 WindowInsetsControllerCompat

首先,我們需要初始化 WindowInsetsControllerCompat。這通常是在 Activity 或者 Fragment 中完成的。

import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat

val windowInsetsController = WindowInsetsControllerCompat(window, window.decorView)

隱藏狀態列和導航欄

透過設定 WindowInsetsCompat.Type.statusBars()WindowInsetsCompat.Type.navigationBars() 可以控制狀態列和導航欄的顯示和隱藏。

windowInsetsController.hide(WindowInsetsCompat.Type.statusBars())
windowInsetsController.hide(WindowInsetsCompat.Type.navigationBars())

顯示狀態列和導航欄

同樣,我們可以透過以下程式碼來顯示狀態列和導航欄。

windowInsetsController.show(WindowInsetsCompat.Type.statusBars())
windowInsetsController.show(WindowInsetsCompat.Type.navigationBars())

設定系統視窗行為

你可以使用 WindowInsetsControllerCompat 來設定系統視窗的顯示行為。例如,可以設定系統欄在滑動手勢下顯示。

windowInsetsController.systemBarsBehavior = 
    WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE

WindowInsetsControllerCompat 的 Behavior 標誌位

WindowInsetsControllerCompatsystemBarsBehavior 屬性決定了系統欄(狀態列和導航欄)在隱藏和顯示時的行為。主要有三個常量可用:

1、 BEHAVIOR_SHOW_BARS_BY_SWIPE(滑動顯示系統欄)

  • 當系統欄隱藏時,使用者可以透過從系統欄區域向內滑動來顯示。

  • 它是API 21(Lollipop)及以上的預設行為。

windowInsetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_SWIPE

2、 BEHAVIOR_SHOW_BARS_BY_TOUCH(觸控顯示系統欄)

  • 當系統欄隱藏時,使用者可以透過觸控式螢幕幕的任意位置來顯示系統欄。這個行為可能導致誤觸。

windowInsetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_TOUCH

3、 BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE(滑動顯示臨時系統欄)

  • 當系統欄隱藏時,使用者可以透過從系統欄區域向內滑動來臨時顯示系統欄。幾秒鐘後系統欄會自動隱藏。

windowInsetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE

設定狀態列和導航欄的顏色樣式

你可以設定狀態列和導航欄的顏色樣式(亮色或暗色),以便在不同主題下提供更好的使用者體驗。

windowInsetsController.isAppearanceLightStatusBars = true // 狀態列使用亮色樣式
windowInsetsController.isAppearanceLightNavigationBars = true // 導航欄使用亮色樣式

示例:簡單的 Activity

下面是一個完整的 Activity 示例,展示瞭如何初始化和使用 WindowInsetsControllerCompat

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        // Initialize the WindowInsetsControllerCompat
        val windowInsetsController = WindowInsetsControllerCompat(window, window.decorView)
        
        // Hide status bar and navigation bar
        windowInsetsController.hide(WindowInsetsCompat.Type.statusBars())
        windowInsetsController.hide(WindowInsetsCompat.Type.navigationBars())

        // Set behavior to show transient bars by swipe
        windowInsetsController.systemBarsBehavior = 
            WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE

        // Set light status bar and navigation bar appearance
        windowInsetsController.isAppearanceLightStatusBars = true
        windowInsetsController.isAppearanceLightNavigationBars = true
    }
}

總結

WindowInsetsControllerCompat 為開發者提供了一種建議使用的方式來處理和控制 Android 系統的視窗插入。與傳統方法相比,它更現代、更靈活,同時也更相容不同的 Android 版本。因此,在處理狀態列、導航欄的顯示和樣式時,建議使用 WindowInsetsControllerCompat

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.