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 標誌位
WindowInsetsControllerCompat
的 systemBarsBehavior
屬性決定了系統欄(狀態列和導航欄)在隱藏和顯示時的行為。主要有三個常量可用:
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
。