Jetpack Compose 1.0.5版本Button无法通过键盘聚焦触发点击问题
根因
你使用的Jetpack Compose 1.0.5属于早期正式版本,Material Design组件库的Button默认未适配键盘导航、焦点状态响应、按键触发点击的逻辑,需要手动补充配置。如果业务允许升级依赖,直接将Compose版本升级到1.1.0及以上,上述问题默认全部修复,无需额外编码。
如果必须保留1.0.5版本,可按以下方案手动适配:
适配方案
1. 核心适配逻辑
需要给Button补充三个核心配置:
- 显式声明
focusable开启焦点捕获能力 - 监听按键事件,捕获Enter、Space键的按下动作主动触发点击回调
- 根据焦点状态自定义视觉提示样式
2. 完整示例代码
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Tab导航异常可以加下面两行配置 window.decorView.isFocusableInTouchMode = true window.decorView.descendantFocusability = ViewGroup.FOCUS_AFTER_DESCENDANTS setContent { MaterialTheme { Surface(color = MaterialTheme.colors.background) { val interactionSource = remember { MutableInteractionSource() } val isFocused by interactionSource.collectIsFocusedAsState() // 自定义焦点状态的高亮边框 val focusBorder = if (isFocused) { BorderStroke(2.dp, MaterialTheme.colors.primaryVariant) } else null // 把点击逻辑抽成公共方法避免重复写 val handleClick = { println("clicked") } Button( onClick = handleClick, interactionSource = interactionSource, border = focusBorder, modifier = Modifier .focusable(interactionSource = interactionSource) .onKeyEvent { keyEvent -> if (keyEvent.type == KeyEventType.KeyDown && (keyEvent.key == Key.Enter || keyEvent.key == Key.Space) && isFocused ) { handleClick() true } else false } ) { Text(text = "A Button (focused=$isFocused)") } } } } }
内容的提问来源于stack exchange,提问作者fikr4n
相关产品推荐
相关产品推荐

