Вернуть фокус OutlinedTextField при показе прогнозаAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Вернуть фокус OutlinedTextField при показе прогноза

Сообщение Anonymous »

Я создал простой 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»