val density = LocalDensity.current
val imeBottom = WindowInsets.ime.getBottom(density)
创建一个offset随键盘高度变化的修改器
fun Modifier.imeOffset(contentBottom: Int = 0) = composed {
val density = LocalDensity.current
val imeBottom = WindowInsets.ime.getBottom(density)
val navBarBottom = WindowInsets.navigationBars.getBottom(density)
Modifier.offset {
IntOffset(
x =0,
y = (-imeBottom + contentBottom + navBarBottom)
.coerceAtMost(0)
)
}
}
Modifier.imePadding()
只是根据键盘高度变化的填充。如果按钮之间有 100.dp 的空间,则当键盘打开时它仍然是 100.dp。正如问题中提到的那样,您需要有一个不会改变父级位置的
layout
或修饰符,在 OP 的情况下没有兄弟,但偏移量不会像填充那样改变兄弟的位置,因此它可以工作,不像因为当没有空间时填充不会按预期工作但它可以按预期工作,因为它是一个填充修饰符。offset
imePadding
首先你需要设置
能够获得键盘尺寸
创建一个
offset
随键盘高度变化的修改器contentBottom 是 Composable 的底部位置,此 Modifier 将分配给该位置,其计算方式如下
演示
另一个示例是,在要分配 imeOffset 的子项上方有一个包含其他 Composble 的 Column。在这种情况下,padding 会缩小最后一个 Compoasble(Column 中的 TextField 和 Button),因为空间量是 Column 高度 - imePadding,不足以容纳最后一个可组合项。
即使整个 Composable 都被其他同级 Composable 填充,按钮和 TextField 也可以移到键盘上方。