You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何防止Jetpack Compose BasicTextField长按获取焦点?

解决Jetpack Compose BasicTextField仅点击获焦的问题

针对你的需求——让LazyList中的BasicTextField仅在普通点击时获取焦点,长按、滑动等操作不触发编辑模式,可通过以下方案实现:

核心思路

通过FocusRequester手动控制焦点请求,结合自定义pointerInput手势拦截,区分短点击与长按/滑动操作,仅在短点击时触发焦点。

完整实现代码

@Composable
fun EditableLazyListItem() {
    val focusRequester = remember { FocusRequester() }
    val isValidTap = remember { mutableStateOf(true) }

    BasicTextField(
        value = TextFieldValue(
            text = "TEST TEST",
            selection = TextRange("TEST TEST".length)
        ),
        onValueChange = { /* 处理文本更新 */ },
        singleLine = true,
        textStyle = MaterialTheme.typography.body1,
        modifier = Modifier
            .focusRequester(focusRequester)
            // 处理点击与长按手势
            .pointerInput(Unit) {
                detectTapGestures(
                    onPress = {
                        isValidTap.value = true
                        tryAwaitRelease()
                        if (isValidTap.value) {
                            focusRequester.requestFocus()
                        }
                    },
                    onLongPress = {
                        isValidTap.value = false
                    }
                )
            }
            // 拦截滑动手势
            .pointerInput(Unit) {
                detectDragGestures { _, _ ->
                    isValidTap.value = false
                }
            }
    )
}

代码说明

  1. FocusRequester:接管TextField的焦点控制权,替代默认的自动获焦逻辑。
  2. detectTapGestures:
    • onPress:按下时标记为有效点击候选,等待手势释放;若未触发长按,则请求焦点。
    • onLongPress:触发长按时立即标记为无效点击,阻止焦点请求。
  3. detectDragGestures:检测到滑动操作时,标记为无效点击,避免滑动触发编辑模式。

适配LazyList场景

该方案完美适配你的列表需求:

  • 点击TextField时正常进入编辑状态。
  • 长按列表项排序、滑动删除时,不会触发TextField焦点。

内容的提问来源于stack exchange,提问作者muetzenflo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 22:33:27