Когда элемент списка ленивых столбцов длинный, клавиатура закрывает текстовое поле в Jetpack Compose.
- У меня есть ленивый список текстовых полей в Jetpack Compose (около 10 OutlineTextField())
- Последние несколько текстовых полей скрыты клавиатурой.
- Как я могу переместить эти нижние текстовые поля над клавиатурой? Спасибо
4 ответа
Добавьте это в themes.xml в стиле, который использует ваша деятельность:
AdjustResize | stateVisible
или android:windowSoftInputMode="adjustResize" в вашем манифесте для действий, содержащих ваш список
У меня есть следующие шаги, чтобы получить желаемый результат:
- В файле манифеста добавьте следующее:
<manifest
...
...>
<application
...
...
...>
<activity
...
android:windowSoftInputMode="adjustResize"
...>
...
...
...
</activity>
</application>
</manifest>
- В вашем сочиняемом со ссылкой на
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