在焦点上自动选择 TextField 文本

时间:2021-02-18 14:39:24

标签: android kotlin android-jetpack-compose

我想要一个 TextField,当用户点击它时,整个文本会自动被选中(这样他们就可以在不按删除键的情况下替换它)。

因为 onFocusChanged(和 onTextInputStarted)在 onValueChange 之前被调用,并且 onValueChange 总是在焦点上被调用,所以我必须防止运行 onValueChange 一次。以下是我使用变量 (valueChangeLock) 的方法:

var value by remember { mutableStateOf(TextFieldValue("")) }

// onValueChange is called after onFocusChanged, overriding the selection in onFocusChanged.
// Fix: Lock onValueChange when calling onFocusChanged
var valueChangeLock = false
BasicTextField(
    value = value,
    onValueChange = {
        if (valueChangeLock) {
            valueChangeLock = false
        } else {
            value = TextFieldValue(it.text, TextRange(it.text.length))
        }
    },
    modifier = modifier.onFocusChanged {
        if (it.isFocused) {
            valueChangeLock = true
            tfValue = TextFieldValue(value, TextRange(0, value.length))
        }
    },
)

有没有更好的方法来实现这一点?

1 个答案:

答案 0 :(得分:0)

您可以使用 Modifier.clickable 界面来简化此操作。

const requests = [ 
    this.myService.getStronglyTypedData1(),
    this.myService.getStronglyTypedData2()
];
forkJoin(requests)
    .subscribe(([data1, data2]: [StrongData1[], StrongData2[]]) => {
        this.stronglyTypedData1 = data1;
        this.stronglyTypedData2 = data2;
        this.isLoaded = true;
    });

还可以考虑将您的文本包裹在 SelectionContainer