我使用Scaffold
作为主屏幕,并在应用程序的每个屏幕上都可以看到固定的bottomBar
,并将Scaffold
的innerPadding
应用于其内容。
我希望键盘出现在bottomBar
上,为此,我只将imePadding()
应用于Scaffold
的内容。
然而,当键盘打开时,Scaffold
的innerPading
和imePadding()
都应用于内容填充。
我试过通过伴奏信息迁移,但运气不好。
无论怎样,我是否可以阻止它,并且只应用其中一种?
下面是我的一段代码:
Scaffold(
topBar = { },
bottomBar = { },
modifier = Modifier
.systemBarsPadding()
) { innerPadding ->
Content(
modifier = Modifier
.padding(innerPadding)
.imePadding()
)
}
这就是结果:
对于现在不推荐的伴奏元素,我使用了以下解决方案:
val isImeVisible = LocalWindowInsets.current.ime.isVisible
val contentPadding = remember(isImeVisible) {
if (isImeVisible) PaddingValues(top = innerPadding.calculateTopPadding()) else innerPadding
}
发布于 2022-03-31 06:47:27
根据伴奏信息迁移的说法,LocalWindowInsets.current.ime
应该被WindowInsets.ime
取代。
它目前还没有isVisible
,直到这个错误被修复为止。现在我是如何重新创建它的:
val WindowInsets.Companion.isImeVisible: Boolean
@Composable
get() {
val density = LocalDensity.current
val ime = this.ime
return remember {
derivedStateOf {
ime.getBottom(density) > 0
}
}.value
}
用法:
val isImeVisible = WindowInsets.isImeVisible
这应该适用于旧的remember(isImeVisible)
代码。
发布于 2022-07-18 12:04:06
另一个解决方案是将BringIntoViewRequester
设置为Scaffold中的内容。然后,当textField集中时,您可以调用bringIntoViewRequester.bringIntoView()
。这样你就不需要设置任何垫子。
val bringIntoViewRequester = remember { BringIntoViewRequester() }
Column(
modifier = Modifier.bringIntoViewRequester(bringIntoViewRequester)
) {
TextField(
value = "",
onValueChange = {},
modifier = Modifier
.onFocusEvent {
if (it.isFocused) {
coroutineScope.launch {
delay(350)
bringIntoViewRequester.bringIntoView()
}
}
}
)
}
发布于 2022-11-28 16:49:40
尝试使用这样的方法(警告: consumedWindowInsets是实验性的,但它正在工作):
Scaffold(
topBar = { },
bottomBar = { },
modifier = Modifier
.systemBarsPadding()
) { innerPadding ->
Content(
modifier = Modifier
.consumedWindowInsets(innerPadding)
.padding(innerPadding)
.imePadding()
)
}
https://stackoverflow.com/questions/71610150
复制相似问题