当TextField被聚焦时,它会被键盘遮挡。

14

我遇到了一个 TextField 被键盘遮挡的问题。我在这里找到了类似问题的答案(链接),但是它们对我的情况没有帮助。我有一个 LazyColumn,在其中列出了不同的组合,当窗口中的元素不足以激活滚动时,聚焦于 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 个 TextFields 时,聚焦在它们中的任何一个并不会使它们上移。

我也尝试过使用 RelocationRequester() 并且使用带有滚动条的 Column 替换了 LazyColumn,但都没有起作用。


看起来这就像是谷歌的问题 https://issuetracker.google.com/issues/192043120?pli=1 - anna_manzhula
3个回答

20

这是一些事情的组合......

  1. 您需要在Android.xml中的活动声明中添加此内容。
android:windowSoftInputMode="adjustResize"
  1. 按照您所提到的方式,在您的TextField中使用BringIntoViewRequester作为修饰符。
.bringIntoViewRequester(yourBringIntoViewRequester)
  1. 当组件通过FocusRequester被程序化地聚焦时,上述步骤对我有效。但是,当用户点击TextField时,它对我不起作用。因此,我实现了一种解决方法(我并不太自豪):当TextField获得焦点时,我稍微等待一下再使用RelocationRequester。所以,我将这个修饰符添加到我的TextField
.onFocusEvent {
    if (it.isFocused) {
        coroutineScope.launch {
            delay(200)
            yourBringIntoViewRequester.bringIntoView()
        }
    }
}

这三件事对我起了作用。


谢谢你的回答,它总体上起作用了,但是我将最后一段代码移到了onFocusChanged回调中,否则它会跳来跳去。 - anna_manzhula
对我来说,这似乎是框架的一个错误,但添加延迟可以使其正常工作。 - J. Hegg
1
这个问题对我来说也只有在延迟后才能解决... 有人在问题跟踪器上报告了这个问题吗?否则我会去报告的... - Edward van Raak
延时对我有效。 - Cyph3rCod3r

5
请将以下内容添加到您的清单文件中的活动部分。
 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="adjustResize"

  2. 您需要将 wrapContentHeight().navigationBarsWithImePadding() 设置为父组合的修饰符:

    Column(modifier = Modifier.wrapContentHeight().navigationBarsWithImePadding()){}

这个解决方案对我很有用。


2
你使用的Jetpack Compose版本是什么?我找不到navigationBarsWithImePadding() - Eenvincible
尽管它在最新版本中已被弃用。 - Sarojini2064130
在新版本中可能会替换它的是什么? - Eenvincible
2
navigationBarsPadding().imePadding() - Sarojini2064130

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接