当聚焦时,TextField 隐藏在键盘下方

问题描述 投票:0回答:4

我对隐藏在键盘下的 TextField 有问题,我在here找到了类似问题的答案,但它们对我的情况没有帮助。我有一个 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 个 CustomTextField,则当其中一个 TextField 获得焦点时,滚动就会起作用。但是,当 uiList 中只有 2 个 TextField 时,关注其中任何一个都不会将它们提升到键盘上方。

我还尝试使用 RelocationRequester() 并使用带有滚动的 Column 而不是 LazyColumn,但没有任何帮助。

android-jetpack android-jetpack-compose android-jetpack-compose-list android-compose-textfield
4个回答
20
投票

这是多种事物的结合...

  1. 您需要将其添加到 Android.xml 中的活动声明中
android:windowSoftInputMode="adjustResize"
  1. 如您所提到的,使用
    BringIntoViewRequester
    作为
    TextField
    中的修饰符。
.bringIntoViewRequester(yourBringIntoViewRequester)
  1. 当组件以编程方式获得焦点时(使用
    FocusRequester
    ),上述步骤对我有用。但是,当用户点击 TextField 时,它对我不起作用。因此,我实施了一个解决方法(我对此并不十分自豪):当
    TextField
    获得焦点时,我稍等一下即可使用
    RelocationRequester
    。所以我将此修改器添加到我的
    TextField
.onFocusEvent {
    if (it.isFocused) {
        coroutineScope.launch {
            delay(200)
            yourBringIntoViewRequester.bringIntoView()
        }
    }
}

这三件事对我有用。


7
投票

将此添加到清单文件中的活动中

 android:windowSoftInputMode="adjustResize"

并在该列中例如使用:

   Column (horizontalAlignment = Alignment.CenterHorizontally,
        modifier = Modifier
            .fillMaxWidth()
            .wrapContentHeight()
            .navigationBarsPadding().imePadding()
            .verticalScroll(rememberScrollState())
            .fillMaxHeight()
            .padding(top = 20.dp))

对我有用,编码愉快..


2
投票
  1. 您需要将其添加到 AndroidManifest.xml 的活动声明中

    android:windowSoftInputMode =“调整调整大小”

  2. 您必须将wrapContentHeight().navigationBarsWithImePadding()设置为父可组合项的修饰符

    Column(修饰符 = Modifier.wrapContentHeight().navigationBarsWithImePadding()){}

这个解决方案对我有用。


0
投票

您可以通过使用consumeWindowInsets(contentPadding).imePadding()来解决这个问题,平滑且最好!

Surface(onClick = {}) {
        Scaffold{ contentPadding->
        Column(
                Modifier
                    .fillMaxSize().
                    consumeWindowInsets(contentPadding).imePadding()
                    .focusable()
                    .background(MaterialTheme.colorScheme.background)
            ) 
© www.soinside.com 2019 - 2024. All rights reserved.