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 ответа

Это комбинация вещей ...

  1. Вам нужно добавить это в объявление вашей активности в Android.xml.
      android:windowSoftInputMode="adjustResize"
  1. Используйте как модификатор в вашем, как вы упомянули.
      .relocationRequester(yourRelocationRequester)
  1. Приведенные выше шаги сработали для меня, когда компонент получает фокус программно (используя 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))

работает для меня, счастливого кодирования ..

  1. Вам нужно добавить это в объявление вашей активности в AndroidManifest.xml.

    android:windowSoftInputMode="adjustResize"

  2. Вы должны установить wrapContentHeight().navigationBarsWithImePadding() в модификатор родительского компонуемого

    Столбец (модификатор = Modifier.wrapContentHeight().navigationBarsWithImePadding()){}

Это решение сработало для меня.