撰写中的文本字段:双击选择文本不起作用

问题描述 投票:0回答:3

我正在使用 Jetpack Compose。 在以前的 Android 视图中,我们可以双击 EditText/TextInputLayout/TextInputEditText 中的单词来选择整个单词,并提供复制粘贴、全选等选项。 这不适用于 Jetpack Compose TextField。进行复制粘贴/全选选项的唯一方法是长按文本字段。

这个问题有解决办法吗? (使用 Compose 稳定版本 1.1.1 和 1.2.0-alpha07 进行测试)

android textfield android-jetpack-compose
3个回答
2
投票

此问题已在 Google 的问题跟踪线程中报告:https://issuetracker.google.com/issues/137321832。目前已分配但尚未修复


2
投票

这是一个jetpack compose bug。您可以使用此代码解决问题:

@Composable
fun CustomTextField() {
    val textFieldValue = remember {
        mutableStateOf(TextFieldValue(""))
    }
    val interactionSource = remember { MutableInteractionSource() }
    val isDoubleTap by interactionSource.collectIsDoubleTapAsState()

    LaunchedEffect(isDoubleTap) {
        val endRange = if (isDoubleTap) textFieldValue.value.text.length else 0
        textFieldValue.value =
            textFieldValue.value.copy(
                selection = TextRange(
                    start = 0,
                    end = endRange
                )
            )


    }
    BasicTextField(
        value = textFieldValue.value,
        onValueChange = {
            if (!isDoubleTap) {
                textFieldValue.value = it
            }

        },
        interactionSource = interactionSource
    )

}


@Composable
fun InteractionSource.collectIsDoubleTapAsState(): State<Boolean> {
    val isDoubleTap = remember { mutableStateOf(false) }
    var firstInteractionTimeInMillis = 0L
    LaunchedEffect(this) {
        interactions.collect { interaction ->
            when (interaction) {
                is PressInteraction.Press -> {
                    val pressTimeInMillis = System.currentTimeMillis()
                    if (pressTimeInMillis - firstInteractionTimeInMillis <= 500L) {
                        firstInteractionTimeInMillis = 0
                        isDoubleTap.value = true

                    } else {
                        firstInteractionTimeInMillis = System.currentTimeMillis()
                        isDoubleTap.value = false
                    }

                }
            }

        }
    }
    return isDoubleTap
}

您可以将其用于

TextField
BasicTextField
OutlineTextField
。请检查此要点以了解更多详细信息。


0
投票

在文本字段中双击或三次单击不起作用,但如果您只需点击光标的蓝色水滴一次,就会显示弹出窗口

© www.soinside.com 2019 - 2024. All rights reserved.