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
。