我有一个带有文本字段的固定底部容器。我使用 imePadding 修饰符。当键盘出现时,imePadding 似乎会工作两次。它仅发生在某些设备上。特别是我的是三星 Galaxy A80 (Android 11)
代码示例
Scaffold(
modifier = Modifier.fillMaxSize(),
bottomBar = {
Box(
Modifier
.imePadding()
.height(100.dp)
.background(Color.Red),
) {
BasicTextField(
modifier = Modifier.fillMaxWidth(),
value = "some text",
onValueChange = {},
)
}
},
) {
Box(
Modifier.fillMaxSize().padding(bottom = it.calculateBottomPadding()),
) {
LazyColumn(
modifier = Modifier.fillMaxSize(),
) {
repeat((0..100).count()) {
item {
Box(Modifier.fillMaxWidth().height(100.dp).background(Color.Blue)) {
}
}
}
}
}
}
UPD 当我添加时问题重现:
window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
将此行添加到 AndroidManifest.xml 文件中的 Activity
android:windowSoftInputMode="adjustResize"
。 Activity 的布局将调整大小,以确保即使在不使用任何 imePadding()
修饰符的情况下显示软键盘,其所有可见内容仍然可见。
在这里您可以看到改进的代码。
var value by remember { mutableStateOf("") }
Scaffold(
bottomBar = {
Box(modifier = Modifier
.fillMaxWidth()
.background(MaterialTheme.colorScheme.surface)) {
OutlinedTextField(
modifier = Modifier.fillMaxWidth(), value = value,
onValueChange = { value = it }
)
}
},
) { paddingValues ->
LazyColumn(
modifier = Modifier
.fillMaxSize()
.padding(paddingValues),
contentPadding = PaddingValues(12.dp, 16.dp),
verticalArrangement = Arrangement.spacedBy(4.dp),
) {
items(100) {
Card(modifier = Modifier.fillMaxSize()) {
Text(text = "Item $it", modifier = Modifier.padding(8.dp))
}
}
}
}
我也遇到过这个问题;更具体地说,某些设备似乎会忽略 adjustmentResize,但在 adjustmentResize 旁边添加 imePadding 会导致其他设备将其加倍。
我自己通过以下方式解决了这个问题:
android:windowSoftInputMode="adjustNothing"
consumeWindowInsets(contentPadding)
,否则 contentPadding 将在 imePadding 中额外消耗。类似:
Scaffold(...){ contentPadding ->
Box(
modifier = Modifier
.padding(contentPadding)
.consumeWindowInsets(contentPadding)
.imePadding()
){...}
}
我不能保证这是最佳实践或它在所有情况下都有效,但它对我有用。