TextField скрывается под клавиатурой при фокусировке
У меня есть проблема с TextField , что скрывается под клавиатурой, я нашел ответы на аналогичный вопрос здесь, но они не помогают мне в моем случае. У меня есть LazyColumn со списком различных компонентов в нем, и когда у меня недостаточно элементов в окне для активации прокрутки, фокусировка на TextField не поднимает сфокусированное TextField над клавиатурой. Клавиатура просто скрывает это. Мой код:
val listState = rememberLazyListState()
typealias ComposableType = @Composable (Int) -> Unit
val uiList = listOf<ComposableType>( {IconButton}, {Text}, {CustomTextField(listState,it)}, {CustomTextField(listState,it)})
LazyColumn() {
itemsIndexed(uiList) { index, ui ->
ui.invoke(index)
}
}
val scope = rememberCoroutineScope()
@Composable
CustomTextField(scrollState: LazyListState, position: Int) {
OutlinedTextField(
modifier = Modifier.onFocusEvent { focusState ->
if (focusState.isFocused) {
scope.launch {
scrollState.animateScrollToItem(position)
}
}
)
}
Так, например, если в моем uiList есть 10 CustomTextFields, прокрутка работает, когда один из TextField находится в фокусе. Но когда в uiList всего 2 текстовых поля, фокусировка на любом из них не поднимает их над клавиатурой.
Также я пробовал использовать RelocationRequester () и использовал Column с прокруткой вместо LazyColumn, ничего из этого не помогло.
3 ответа
Это комбинация вещей ...
- Вам нужно добавить это в объявление вашей активности в Android.xml.
android:windowSoftInputMode="adjustResize"
- Используйте как модификатор в вашем, как вы упомянули.
.relocationRequester(yourRelocationRequester)
- Приведенные выше шаги сработали для меня, когда компонент получает фокус программно (используя
FocusRequester
). Однако, когда пользователь нажимает на TextField, у меня это не сработало. Поэтому я реализовал обходной путь (которым я не очень горжусь): когда фокусируется усиление, я немного жду, чтобы использоватьRelocationRequester
. Поэтому я добавил этот модификатор в свойTextField
.
.onFocusEvent {
if (it.isFocused) {
GlobalScope.launch {
delay(200)
yourRelocationRequester.bringIntoView()
}
}
}
Эти три вещи у меня сработали.
Добавьте это в свою активность в файле манифеста
android:windowSoftInputMode="adjustResize"
И в столбце, например, используйте:
Column (horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier
.fillMaxWidth()
.wrapContentHeight()
.navigationBarsPadding().imePadding()
.verticalScroll(rememberScrollState())
.fillMaxHeight()
.padding(top = 20.dp))
работает для меня, счастливого кодирования ..
Вам нужно добавить это в объявление вашей активности в AndroidManifest.xml.
android:windowSoftInputMode="adjustResize"
Вы должны установить wrapContentHeight().navigationBarsWithImePadding() в модификатор родительского компонуемого
Столбец (модификатор = Modifier.wrapContentHeight().navigationBarsWithImePadding()){}
Это решение сработало для меня.