微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决聚焦时,TextField 隐藏在键盘下方

我有一个隐藏在键盘下的 TextField 问题,我已经找到了类似问题 here 的答案,但它们对我的情况没有帮助。我有一个 LazyColumn,其中包含不同组合项的列表,并且当窗口中没有足够的元素来激活滚动时,专注于 TextField 并没有将聚焦的 TextField 提升到键盘上方。键盘只是隐藏它。 我的代码

val listState = rememberLazyListState()
typealias ComposableType = @Composable (Int) -> Unit
val uiList = listof<ComposableType>( {IconButton},{Text},{CustomTextField(listState,it)},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 个 TextFields 时,关注它们中的任何一个都不会将它们抬高到键盘上方。

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

解决方法

这是一个组合...

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

这三件事对我有用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。