如何避免Jetpack Compose内容在键盘打开时上移

6

List of items should stay in their position

如上所示,当用户打开键盘时,项目列表、文本输入框和添加按钮会上移,我希望项目列表保持位置不变,而文本输入框和添加按钮像以前一样上移。
代码:
活动:
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContent {
        OlegarioLopezTheme {
            Surface(
                modifier = Modifier.fillMaxSize(),
                color = MaterialTheme.colors.background
            ) { Navigation() }
        }
    }
}

Navigation()函数只是调用Composable。
可组合项:
    @Composable
fun ListScreen(
    viewModel: MainScreenViewModel,
    navController: NavController
) {
    LazyColumn{...}
MainTextField(viewModel)
    AddButton(viewModel)
}
2个回答

11

确保活动的 windowSoftInputMode 设置为 adjustResize

<activity
      android:name=".MyActivity"
      android:windowSoftInputMode="adjustResize">
</activity>

这样,活动的主窗口总是被调整大小以为屏幕上的软键盘腾出空间。

然后只需使用以下布局:

Column() {
    LazyColumn(Modifier.weight(1f)) {
      //..
    }
    Row(){
        TextField()
        Button()
    }
}

我不知道它是如何做到的,但它正好实现了我想要的功能,它将文本输入和添加按钮推上去,但将项目列表保留在原位,我想了解它是如何知道哪个组合应该被推送而哪个不应该,可能只是运气好罢了。 谢谢! - Olegario López
@OlegarioLópez 请查看文档。它解释了活动的主窗口如何与包含屏幕软键盘的窗口交互。使用adjustResize,活动的主窗口始终会被调整大小以为屏幕上的软键盘腾出空间。然后检查您的代码和屏幕,我猜测您正在使用权重修饰符来调整列表或使用约束将文本字段放置在屏幕底部。 - Gabriele Mariotti

1
这正是我的问题,只不过有一个额外的转折:它只在活动从暂停状态返回后才成为问题。全新的状态没有问题,但是当恢复时,整个主活动突然被键盘推上去了。非常奇怪的行为。我实际上将windowSoftInputMode设置为“adjustPan”,现在它的表现符合预期,就像一个全新的活动一样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接