如何让模态底部弹出框和键盘在同一个动画中同时显示?
我的 ModalBottomSheet 包含一个 TextField。当底部弹出层出现时,我也希望键盘一起弹出,这样就能直接在字段中输入文本。
不过现在,ModalBottomSheet 会先出现,然后键盘再弹出。键盘的动画结束后,ModalBottomSheet 会覆盖在上面,这看起来有点别扭。
val sheetState = rememberModalBottomSheetState()
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TimestampEditorSheet(
timestamp: Timestamp,
onDismiss: () -> Unit,
onSave: (Timestamp) -> Unit,
sheetState: SheetState,
) {
val scope = rememberCoroutineScope()
val focusRequester = remember { FocusRequester() }
LaunchedEffect(Unit) {
focusRequester.requestFocus()
}
ModalBottomSheet(
onDismissRequest = onDismiss,
sheetState = sheetState,
dragHandle = {},
) {
TextField(
state = textFieldState,
placeholder = { Text("Description") },
modifier = Modifier
.weight(1f)
.focusRequester(focusRequester),
)
}

我找到的唯一其他选项是在请求焦点之前等待模态动画完成。
sheetState.isAnimationRunning=true 只是在模态完全出现后半秒才设置,所以仍然没有达到我想要的那种顺滑感。

LaunchedEffect(sheetState.currentValue) {
if(!sheetState.isAnimationRunning && sheetState.currentValue == SheetValue.Expanded) {
focusRequester.requestFocus()
}
}
当我旋转设备时,模态框和键盘会一起出现,因此这个动画是完全可以实现的。

编辑:
我尝试给模态工作表的内容添加底部填充,这样在初始动画时内容能出现在键盘之上,勉强实现了这个效果,但仍然不完美。
解决方案
我使用了一个 [BottomSheetDialogFragment][2],正是我一直在寻找的。
我遇到了一个问题:键盘会遮挡Compose的 TextField,但当我使用XML的 EditText时它能正常工作,不过这是另一个问题。
XML视图:
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。


