首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Jetpack Compose,在TextField中自定义光标位置

Jetpack Compose,在TextField中自定义光标位置
EN

Stack Overflow用户
提问于 2021-01-04 22:23:40
回答 1查看 2K关注 0票数 3

当TextField获得焦点时,如何将光标设置在任意位置?相当于editText.setSelection(position)的经典android视图系统。

这是我用来让编辑文本在添加到屏幕时自动接收焦点的代码。我希望能够将光标从默认位置0移动

代码语言:javascript
运行
复制
val (getText, setText) = remember { mutableStateOf("hello") }
AutofocusEditText(
    text = getText,
    setText = setText
)
    
...

@Composable
private fun AutofocusEditText(
    text: String,
    setText : (String) -> Unit
) {
    val focusState = remember { mutableStateOf(FocusState.Inactive) }
    val focusRequester = FocusRequester()
    val focusModifier = Modifier.focus()
    Row(
        modifier = Modifier.focusObserver { newFocusValue -> focusState.value = newFocusValue }
    ) {
        val focusRequesterModifier =
            Modifier.focusRequester(focusRequester)

        TextField(
            value = text,
            modifier = focusModifier.then(focusRequesterModifier),
            backgroundColor = Color.Transparent,
            onValueChange = setText,
            keyboardOptions = KeyboardOptions.Default.copy(
                imeAction = ImeAction.Done
            ),
            onImeActionPerformed = { action, softKeyboardController ->
                if (action == ImeAction.Done) {
                    softKeyboardController?.hideSoftwareKeyboard()
                }
            }
        )
    }
    onActive {
        focusRequester.requestFocus()
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-04 23:46:09

您必须使用TextField的TextFieldValue版本。

代码语言:javascript
运行
复制
@Composable
fun TextField(
    value: TextFieldValue,
    onValueChange: (TextFieldValue) -> Unit,
    /* ... */) {/* Impl */}

代码的简化版本:

代码语言:javascript
运行
复制
    @Composable
    fun AutoFocusingText() {
        val textState = remember { mutableStateOf(TextFieldValue()) }
        val focusState = remember { mutableStateOf(FocusState.Inactive) }
        val focusRequester = FocusRequester()
        val focusModifier = Modifier.focus()
        Row(
            modifier = Modifier.focusObserver { focusState.value = it }
        ) {
            val focusRequesterModifier = Modifier.focusRequester(focusRequester)
            TextField(
                modifier = focusModifier.then(focusRequesterModifier),
                value = textState.value,
                onValueChange = { value: TextFieldValue ->
                    textState.value = value
                }
            )
        }
        onActive {
            focusRequester.requestFocus()
        }
    }

如果初始值为非空字符串,则必须手动更改选择。将空TextFieldValue替换为:TextFieldValue(text = value, selection = TextRange(value.length, value.length))

当您想要像在代码中那样提取值时。您可以将当前选择作为参数添加,也可以将其与TextFieldValue结合提取。否则,如果用户在文本中间进行编辑,光标将跳回到下一个onValueChanged的末尾。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65564282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档