8

我对隐藏在键盘下的 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 个 CustomTextField,则当其中一个 TextField 被聚焦时,滚动就会起作用。但是当 uiList 中只有 2 个 TextField 时,关注其中任何一个都不会将它们提升到键盘上方。

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

4

2 回答 2

12

这是一个组合...

  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()
        }
    }
}

这三件事对我有用。

于 2021-06-26T15:25:27.343 回答
0
  1. 您需要在 AndroidManifest.xml 中的活动声明中添加它

    android:windowSoftInputMode="adjustResize"

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

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

这个解决方案对我有用。

于 2022-03-02T14:52:11.733 回答