#android #android-jetpack-compose
Вопрос:
Вот строка, содержащая текстовое поле в полноэкранном столбце. onFocusChanged
обратный вызов вызывается при нажатии на текстовое поле (становится активным) и при нажатии кнопки Готово на клавиатуре. Но обработчик не вызывается, я нажимаю за пределами текстового поля. Поэтому я не могу закрыть клавиатуру. Есть идеи?
val (nameText, setNameText) = remember { mutableStateOf("")}
val keyboardController = LocalSoftwareKeyboardController.current
val focusRequester = FocusRequester()
Column(
modifier = Modifier
.fillMaxWidth()
.fillMaxHeight()
.padding(10.dp)
) {
Row(
modifier = Modifier
.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceAround
) {
TextField(
value = nameText,
onValueChange = setNameText,
modifier = Modifier
.focusRequester(focusRequester)
.onFocusChanged {
if (!it.isFocused) {
keyboardController?.hide()
}
}
.padding(horizontal = 0.dp, vertical = 0.dp)
.height(50.dp)
.fillMaxWidth(),
KeyboardOptions(
keyboardType = KeyboardType.Text,
imeAction = androidx.compose.ui.text.input.ImeAction.Done
),
keyboardActions = KeyboardActions(onDone = {
localFocusManager.clearFocus()
}),
placeholder = { Text("Enter a name", fontSize = 14.sp) }
)
}
}
Я попытался установить обработчик фокуса в столбце, но это не сработало (обработчик фокуса не вызывается при нажатии снаружи). Использование compose версии 1.0.2.
Ответ №1:
Если вы хотите удалить фокус при нажатии, вы можете добавить pointerInput
модификатор с detectTapGestures
помощью Column
:
Column(
modifier = Modifier
.fillMaxWidth()
.fillMaxHeight()
.padding(10.dp)
.pointerInput(Unit) {
detectTapGestures(onTap = {
localFocusManager.clearFocus()
})
}
)
Я добавляю его после padding
модификатора, чтобы часть представления заполнения не получала касаний. Если вы измените порядок, заполнение будет включено в кликабельную часть.
Посмотрите на другие жесты, если вам недостаточно нажатия.