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。它节省了我很多时间!
| 归档时间: |
|
| 查看次数: |
1427 次 |
| 最近记录: |