我正在积极地观察软键盘的可见性,目前,我正在try 用

WindowInsets.isImeVisible

但我似乎观察不到它的状态变化.有人提到使用

ViewCompat.setOnApplyWindowInsetsListener()

但我不太明白如何实现此功能来观察键盘可见性.

我已经设法使用了

WindowInsets.isImeVisible

然而,它只在我导航到页面并且键盘自动打开时才适用.

推荐答案

摘自这S.O条帖子,

您可以使用它来判断keyboardopened还是closed

internal enum class Keyboard {
    Opened, Closed
}

@Composable
internal fun keyboardAsState(): State<Keyboard> {
    val keyboardState = remember { mutableStateOf(Keyboard.Closed) }
    val view = LocalView.current
    DisposableEffect(view) {
        val onGlobalListener = ViewTreeObserver.OnGlobalLayoutListener {
            val rect = Rect()
            view.getWindowVisibleDisplayFrame(rect)
            val screenHeight = view.rootView.height
            val keypadHeight = screenHeight - rect.bottom
            keyboardState.value = if (keypadHeight > screenHeight * 0.15) {
                Keyboard.Opened
            } else {
                Keyboard.Closed
            }
        }
        view.viewTreeObserver.addOnGlobalLayoutListener(onGlobalListener)

        onDispose {
            view.viewTreeObserver.removeOnGlobalLayoutListener(onGlobalListener)
        }
    }

    return keyboardState
}

你可以像这样测试它,

@Composable
fun KeyboardCheck() {

    val keyboard by keyboardAsState()

    Log.e("KeyboardCheck", "$keyboard")

    TextField(value = "", onValueChange = {})
}

每次键盘打开和关闭时,它都会打印

E/KeyboardCheck: Closed
E/KeyboardCheck: Opened
E/KeyboardCheck: Closed
E/KeyboardCheck: Opened
E/KeyboardCheck: Closed

Android相关问答推荐

如何使用Gradle风味在两个Kotlin导入(Google vs Amazon Java billing library)之间进行 Select ?

如何处理谷歌未经证实的应用程序拒绝?

Android compose ,在图像中zoom 而不裁剪?

为什么我有多个Player实例?

OverridePendingTransition已弃用,我该怎么办?

使用Jetpack Compose创建特定于电视的布局

SDK 33 的问题 - 面向 S+(版本 31 及更高版本)要求在创建 PendingIntent 时指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一

java.lang.ExceptionInInitializerError -- 原因:java.lang.NullPointerException

如何知道我的应用程序的新版本是否显示广告?

Android apk 不工作

找不到(包名称).在以下位置搜索:

LazyColumn 项目,隐式接收器无法在此上下文中调用单元

Jetpack Compose TextField 在输入新字符时不更新

协程中的 Job.Cancel 与 Scope.Cancel 有什么区别?

Android WebView 没有在第一次页面完成时从本地存储读取数据?

禁用通知权限后启动前台服务导致崩溃(Android 13)

Android Material Date Range Picker - 如何仅更改所选范围日期的文本 colored颜色 ?

如何根据加载图像的 colored颜色 绘制边框?

为什么我的 imageView 不随 registerForActivityResult 改变?

如何解决错误消息:Inheritance from an interface with '@JvmDefault' members is only allowed with -Xjvm-default option