我正在使用 Jetpack Compose。 在以前的 Android 视图中,我们可以双击 EditText/TextInputLayout/TextInputEditText 中的单词来选择整个单词,并提供复制粘贴、全选等选项。 这不适用于 Jetpack Compose TextField。进行复制粘贴/全选选项的唯一方法是长按文本字段。
这个问题有解决办法吗? (使用 Compose 稳定版本 1.1.1 和 1.2.0-alpha07 进行测试)
此问题已在 Google 的问题跟踪线程中报告:https://issuetracker.google.com/issues/137321832。目前已分配但尚未修复
这是一个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
。请检查此要点以了解更多详细信息。