onKeyEvent 修饰符在 Jetpack Compose 中不起作用

Posted

技术标签:

【中文标题】onKeyEvent 修饰符在 Jetpack Compose 中不起作用【英文标题】:onKeyEvent Modifier doesn't work in Jetpack Compose 【发布时间】:2021-10-21 22:46:20 【问题描述】:
return ComposeView(requireContext()).apply 
    setContent 
        Box(
            Modifier
                .onKeyEvent 
                    if (it.isCtrlPressed && it.key == Key.A) 
                        println("Ctrl + A is pressed")
                        true
                     else 
                        false
                    
                
                .focusable()
        )
    

为什么在使用平板的硬件键盘时无法在片段中调用按键事件?

【问题讨论】:

【参考方案1】:

正如onKeyEvent 的文档所说:

将允许它在它(或其子之一)获得焦点时拦截硬件键事件。

这意味着你需要让你的盒子聚焦,而不仅仅是聚焦。为此,您需要FocusRequester,在我的示例中,我在视图呈现时询问焦点。在this article查看更多信息

为了以后的注意,如果用户点击文本字段,您的框将失去焦点,但如果此 txt 字段在框内,onKeyEvent 仍然可以工作

看起来空框无法成为焦点,因此您需要使用修饰符添加一些大小。它仍然是不可见的:

val requester = remember  FocusRequester() 
Box(
    Modifier
        .onKeyEvent 
            if (it.isCtrlPressed && it.key == Key.A) 
                println("Ctrl + A is pressed")
                true
             else 
                false
            
        
        .focusRequester(requester)
        .focusable()
        .size(10.dp)
)
LaunchedEffect(Unit) 
    requester.requestFocus()

或者,只需将内容添加到 Box,这样它就会拉伸,并且不再需要 .size 修饰符

此代码适用于我的蓝牙键盘 + android 智能手机,模拟器似乎无法识别 CTRL

【讨论】:

以上是关于onKeyEvent 修饰符在 Jetpack Compose 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

C# 中的sealed修饰符学习

访问修饰符在封装中是不是有任何作用[关闭]

为啥受保护的修饰符在 Java 子类中的行为不同?

使用权重修饰符在 LazyColumn 中排列单个项目

java修饰符在含义以及在eclipse下的显示

FINDC() 中的“k”修饰符在 SAS 中如何工作?