Android经典实战之用WindowInsetsControllerCompat方便的显示和隐藏状态栏和导航栏

简介: 本文介绍 `WindowInsetsControllerCompat` 类,它是 Android 提供的一种现代化工具,用于处理窗口插入如状态栏和导航栏的显示与隐藏。此类位于 `androidx.core.view` 包中,增强了跨不同 Android 版本的兼容性。主要功能包括控制状态栏与导航栏的显示、设置系统窗口行为及调整样式。通过 Kotlin 代码示例展示了如何初始化并使用此类,以及如何设置系统栏的颜色样式。

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

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


欢迎关注我的公众号AntDream查看更多精彩文章!

目录
相关文章
|
3月前
|
存储 消息中间件 人工智能
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
123 3
|
2月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
283 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
2月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
232 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
2月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
571 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
3月前
|
存储 消息中间件 人工智能
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
248 10
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
|
3月前
|
存储 消息中间件 人工智能
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
115 11
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
|
2月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
142 0
|
3月前
|
XML 存储 Java
【06】AI辅助编程完整的安卓二次商业实战-背景布局变更增加背景-二开发现页面跳转逻辑-替换剩余图标-优雅草卓伊凡
【06】AI辅助编程完整的安卓二次商业实战-背景布局变更增加背景-二开发现页面跳转逻辑-替换剩余图标-优雅草卓伊凡
109 3
【06】AI辅助编程完整的安卓二次商业实战-背景布局变更增加背景-二开发现页面跳转逻辑-替换剩余图标-优雅草卓伊凡
|
3月前
|
存储 消息中间件 人工智能
【04】AI辅助编程完整的安卓二次商业实战-寻找修改替换新UI首页图标-菜单图标-消息列表图标-优雅草伊凡
【04】AI辅助编程完整的安卓二次商业实战-寻找修改替换新UI首页图标-菜单图标-消息列表图标-优雅草伊凡
142 4
|
3月前
|
存储 API Android开发
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
192 4
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡

热门文章

最新文章