Jetpack Compose中Card用Modifier.pointerInput添加长按无响应如何解决
问题原因
手势消费冲突导致自定义检测不生效:Card自带的onClick参数本质是内部封装了优先级更高的clickable修饰符,你手动添加的pointerInput手势检测会被它提前消费触摸事件,所以无法触发回调。你的用法没有问题,只需要停用自带的onClick配置,所有交互逻辑统一通过手势检测实现即可,不需要重写Card的任何样式。
方案1:使用combinedClickable(更推荐)
这是官方提供的组合点击修饰符,同时支持普通点击、长按、双击配置,默认自带点击水波纹效果,不需要手动处理手势检测:
Card( // 不要配置Card构造参数里的onClick! modifier = Modifier .combinedClickable( onClick = { // 普通点击逻辑 clickable() }, onLongClick = { // 长按逻辑 longClickable() } ) ) { // 你的Card内容布局 }
方案2:使用pointerInput的detectTapGestures
你原来的代码用错了回调,普通点击应该用onTap而不是onPress,onPress会在手指按下时立刻触发,不符合普通点击的交互逻辑:
Card( // 不要配置Card构造参数里的onClick! modifier = Modifier .pointerInput(Unit) { detectTapGestures( onTap = { // 普通点击逻辑 clickable() }, onLongPress = { // 长按逻辑 longClickable() } ) } ) { // 你的Card内容布局 }
如果需要保留点击水波纹效果,可以额外给Modifier添加indication和interactionSource配置。
内容的提问来源于stack exchange,提问作者Chris Pi
相关产品推荐
相关产品推荐

