Когда элемент списка ленивых столбцов длинный, клавиатура закрывает текстовое поле в Jetpack Compose.

  • У меня есть ленивый список текстовых полей в Jetpack Compose (около 10 OutlineTextField())
  • Последние несколько текстовых полей скрыты клавиатурой.
  • Как я могу переместить эти нижние текстовые поля над клавиатурой? Спасибо

4 ответа

Добавьте это в themes.xml в стиле, который использует ваша деятельность:

AdjustResize | stateVisible

или android:windowSoftInputMode="adjustResize" в вашем манифесте для действий, содержащих ваш список

У меня есть следующие шаги, чтобы получить желаемый результат:

  1. В файле манифеста добавьте следующее:
      <manifest 
    ...
    ...>

    <application
        ...
        ...
        ...>

        <activity
            ...
            android:windowSoftInputMode="adjustResize"
            ...>
            ...
            ...
            ...
        </activity>
    </application>

</manifest>
  1. В вашем сочиняемом со ссылкой наLazyListStateа затем наблюдайте за деревом просмотра, как показано ниже.ScrollOnKeyboardVisibility()функция.
      @Composable
fun UI(){
    val lazyColumnState = rememberLazyListState()
    val coroutineScope = rememberCoroutineScope()
    Column {
        LazyColumn (
            state = lazyColumnState
        ){
            ...
            ...
            ...
        }
        ...
        ...
        ...    
    }
    ScrollOnKeyboardVisibility(lazyColumnState, coroutineScope)
}


@Composable
fun ScrollOnKeyboardVisibility(lazyListState: LazyListState, coroutineScope: CoroutineScope) {
    val currentView = LocalView.current
    val prevScrollPosition = currentView.bottom
    var keyboardSize by remember{ mutableStateOf(0)}

    currentView.viewTreeObserver.addOnGlobalLayoutListener {
        if (lazyListState.layoutInfo.visibleItemsInfo.isNotEmpty()) {
            val currentScreenSize = currentView.bottom
            if (currentScreenSize != actualScreenSize) { // keyboard is visible
                coroutineScope.launch {
                    delay(200)
                    if (keyboardHeight == 0){
                        keyboardHeight = actualScreenSize - currentScreenSize
                    }
                    lazyListState.animateScrollBy(keyboardHeight.toFloat())
                }
            }else {
                // keyboard is not visible
            }
        }
    }
}

Здесь всякий раз, когда клавиатура становится видимой, мы прокручиваем вверх по высоте клавиатуры и всякий раз, когда клавиатура становится невидимой, прокручиваемLazyColumnвниз по высоте клавиатуры

В моем случае мне пришлось удалитьandroid:windowSoftInputMode="adjustResize"из манифеста, и после этого клавиатура перестала прыгать.

You need to implement the accompanist-insets dependencies

      implementation "com.google.accompanist:accompanist-insets:<version>"
// If using insets-ui
implementation "com.google.accompanist:accompanist-insets-ui:<version>"

Then use the ProvideWindowInsets(windowInsetsAnimationsEnabled = true) as showin in following code in your MainActivity.

      setContent {
        ProvideWindowInsets(windowInsetsAnimationsEnabled = true) {
            MyApplicationTestTheme {
               //your content goes here
            }
        }
 }

For more details check out the documentation

Другие вопросы по тегам