Jetpack Compose - 滚动到列中的可组合焦点

rad*_*zio 8 android-jetpack-compose android-jetpack-compose-text

我有这样的用户界面:

val scrollState = rememberScrollState()
        Column(
            modifier = Modifier
                .fillMaxSize(1F)
                .padding(horizontal = 16.dp)
                .verticalScroll(scrollState)
        ) {

            TextField(...)
 // multiple textfields
             TextField(
                        //...
                        modifier = Modifier.focusOrder(countryFocus).onFocusChanged {
                            if(it == FocusState.Active) {
                               // scroll to this textfield
                            }
                        },
                    )
         }
Run Code Online (Sandbox Code Playgroud)

我在此列中有多个 TextFields,当其中一个聚焦时,我想将 Column 滚动到它。scrollState 中有一个方法,scrollState.smoothScrollTo(0f)但我不知道如何获得聚焦的 TextField 位置。

更新:

看来我找到了一个可行的解决方案。我用过onGloballyPositioned并且有效。但我不确定这是否是解决此问题的最佳方法。

var scrollToPosition = 0.0F

TextField(
   modifier = Modifier
    .focusOrder(countryFocus)
    .onGloballyPositioned { coordinates ->
        scrollToPosition = scrollState.value + coordinates.positionInRoot().y
    }
    .onFocusChanged {
    if (it == FocusState.Active) {
        scope.launch {
            scrollState.smoothScrollTo(scrollToPosition)
        }
    }
}
)
Run Code Online (Sandbox Code Playgroud)

小智 8

您也可以使用 BringIntoViewRequester

//
val bringIntoViewRequester = remember { BringIntoViewRequester() }
val coroutineScope = rememberCoroutineScope()
//--------
TextField( ..., modifier = Modifier.bringIntoViewRequester(bringIntoViewRequester)
.onFocusEvent {
                        if (it.isFocused) {
                            coroutineScope.launch {
                                bringIntoViewRequester.bringIntoView()
                            }
                        }
                    }
Run Code Online (Sandbox Code Playgroud)


小智 1

看来使用LazyColumnandLazyListState.animateScrollToItem()代替Column对于您的情况来说可能是一个不错的选择。

参考: https: //developer.android.com/jetpack/compose/lists#control-scroll-position

顺便说一下,感谢您提供有关修饰符的信息onGloballyPositioned()。我正在寻找正常情况的解决方案Column。它节省了我很多时间!