Я создал простой CustomTextField на основе OutlinedTextField и DropDownMenu, чтобы иметь возможность отображать прогноз пользователя при вводе текста. Существуют предсказанные значения: List, которые сравниваются с фактическим вводом и становятся видимыми, когда совпадают хотя бы первые 3 символа. Но после того, как значения прогнозирования отображаются в DropDownMenu, OutlinedTextField теряет фокус, и я не могу вернуть его, поэтому пользователь не может писать дальнейшие символы. Есть идеи, как это решить?
@Composable
fun CustomTextField(
name: String,
value: String,
onChange: (String) -> Unit,
predictionValues: List = emptyList(),
visualTransformation: VisualTransformation? = null,
modifier: Modifier = Modifier,
keyboardType: KeyboardType? = null,
imeAction: ImeAction? = null,
isEnabled: Boolean = true,
keyboardActions: KeyboardActions = KeyboardActions.Default,
trailingIcon: @Composable (() -> Unit)? = null
) {
var expanded by remember { mutableStateOf(false) }
var filteredOptions by remember { mutableStateOf(emptyList()) }
val focusRequester = remember { FocusRequester() }
var textFieldValue by remember { mutableStateOf(TextFieldValue(text = value)) }
fun filterOptions(query: String) {
if (query.length >= 3) {
filteredOptions = predictionValues.filter { it.contains(query, ignoreCase = true) }
expanded = filteredOptions.isNotEmpty()
} else {
expanded = false
}
}
LaunchedEffect(textFieldValue.text) {
if (textFieldValue.text != value) {
onChange(textFieldValue.text)
}
}
Column(modifier = modifier.fillMaxWidth()) {
OutlinedTextField(
value = textFieldValue,
onValueChange = { newValue ->
textFieldValue = newValue
filterOptions(newValue.text)
},
enabled = isEnabled,
modifier = Modifier
.fillMaxWidth()
.focusRequester(focusRequester),
keyboardOptions = keyboardOptions ?: KeyboardOptions(
keyboardType = keyboardType ?: KeyboardType.Text,
imeAction = imeAction ?: ImeAction.Default
),
singleLine = true,
label = { Text(text = name) },
visualTransformation = visualTransformation ?: VisualTransformation.None,
keyboardActions = keyboardActions,
trailingIcon = { trailingIcon?.invoke() }
)
DropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false }
) {
filteredOptions.forEach { option ->
DropdownMenuItem(
text = { Text(option) },
onClick = {
textFieldValue = TextFieldValue(
text = option,
selection = TextRange(option.length)
)
expanded = false
focusRequester.requestFocus()
}
)
}
}
if (expanded) {
LaunchedEffect(Unit) {
focusRequester.requestFocus()
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... prediction
Вернуть фокус OutlinedTextField при показе прогноза ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Мои 3 часовые данные прогноза не отражаются на моем HD, показали все способные прогноза
Anonymous » » в форуме Html - 0 Ответы
- 16 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Мои 3 часовые данные прогноза не отражаются на моем HD, показали все способные прогноза
Anonymous » » в форуме Html - 0 Ответы
- 26 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Мои 3 часовые данные прогноза не отражаются на моем HD, показали все способные прогноза
Anonymous » » в форуме Html - 0 Ответы
- 20 Просмотры
-
Последнее сообщение Anonymous
-