Очерченное текстовое поле jetpack сочиняет за клавиатурой

#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" , он перемещает окно вверх, чтобы ваше текстовое поле стало видимым