#android #textfield #android-jetpack-compose #android-softkeyboard
#Android #текстовое поле #android-jetpack-сочинять #android-софтборд
Вопрос:
Я использую Jetpack Compose для создания пользовательского интерфейса приложения, но у него есть некоторые проблемы: при нажатии кнопки «Далее» на клавиатуре она перемещает фокус на следующий TextField
(количество), что нормально, но проблема в том, что экран находится TextField
за клавиатурой, это означает, что анимация экрана не запускается:
Как переместить экран на новый следующий ввод?
@Composable fun KeyboardSample() { Scaffold( modifier = Modifier .fillMaxSize() .padding(start = 16.dp, end = 16.dp), ) { val name = rememberSaveable { mutableStateOf("") } val updateName = { _name: String -gt; name.value = _name } val amount = rememberSaveable { mutableStateOf("") } val updateAmount = { _amount: String -gt; amount.value = _amount } TextFieldsToExperiment( name = name.value, updateName = updateName, amount = amount.value, updateAmount = updateAmount ) } } @Composable fun TextFieldsToExperiment( name: String, updateName: (String) -gt; Unit, amount: String, updateAmount: (String) -gt; Unit ) { val focusManager = LocalFocusManager.current val focusRequester = FocusRequester() Column( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { Spacer(modifier = Modifier.height(390.dp)) OutlinedTextField( value = name, onValueChange = updateName, label = { Text("Name") }, placeholder = { Text(text = "Name") }, singleLine = true, keyboardOptions = KeyboardOptions.Default.copy( capitalization = KeyboardCapitalization.Sentences, autoCorrect = true, keyboardType = KeyboardType.Text, imeAction = ImeAction.Next ), keyboardActions = KeyboardActions(onNext = { focusManager.moveFocus(FocusDirection.Down) }), modifier = Modifier .fillMaxWidth() .padding(top = 6.dp, start = 0.dp, end = 0.dp, bottom = 6.dp), ) Text(text = "Hello") Spacer(Modifier.height(8.dp)) OutlinedTextField( value = amount, onValueChange = updateAmount, label = { Text("Amount") }, placeholder = { Text(text = "Amount") }, singleLine = true, keyboardOptions = KeyboardOptions.Default.copy( capitalization = KeyboardCapitalization.Sentences, autoCorrect = true, keyboardType = KeyboardType.Text, imeAction = ImeAction.Done ), keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }), modifier = Modifier .fillMaxWidth() .focusRequester(focusRequester) .padding(top = 6.dp, start = 0.dp, end = 0.dp, bottom = 6.dp), ) } }
Кроме того, я добавляю несколько фотографий, чтобы лучше проиллюстрировать проблему:
Пользовательский интерфейс без клавиатуры:
Name Focused
Amount Focused
Ответ №1:
Поместите содержимое KeyboardSample() в колонку LazyColumn, как это
@Composable fun KeyboardSample() { Scaffold( modifier = Modifier .fillMaxSize() .padding( start = 16.dp, end = 16.dp ), ) { val name = rememberSaveable { mutableStateOf("") } val updateName = { _name: String -gt; name.value = _name } val amount = rememberSaveable { mutableStateOf("") } val updateAmount = { _amount: String -gt; amount.value = _amount } LazyColumn{ item { TextFieldsToExperiment( name = name.value, updateName = updateName, amount = amount.value, updateAmount = updateAmount ) } } } }
И самое главное добавьте это в свою деятельность в манифесте
android:windowSoftInputMode="adjustResize"
Комментарии:
1. вы можете объявить изменяемое состояние как
val (name, updateName) = ...
вместо тех лямбд, которые вы создаете вручную.2. Я пробую эту реализацию, однако
focusManager.moveFocus(FocusDirection.Down)
она перестает работать, а поле все еще не движется
Ответ №2:
Просто добавьте это
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
после onCreate
Ответ №3:
вы пробовали android:windowSoftInputMode="adjustPan"
, он перемещает окно вверх, чтобы ваше текстовое поле стало видимым