首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Jetpack中在Scaffold的bottomBar上显示键盘,编写并使用合适的嵌入垫

在Jetpack中在Scaffold的bottomBar上显示键盘,编写并使用合适的嵌入垫
EN

Stack Overflow用户
提问于 2022-03-24 22:23:44
回答 3查看 1.7K关注 0票数 7

我使用Scaffold作为主屏幕,并在应用程序的每个屏幕上都可以看到固定的bottomBar,并将ScaffoldinnerPadding应用于其内容。

我希望键盘出现在bottomBar上,为此,我只将imePadding()应用于Scaffold的内容。

然而,当键盘打开时,ScaffoldinnerPadingimePadding()都应用于内容填充。

我试过通过伴奏信息迁移,但运气不好。

无论怎样,我是否可以阻止它,并且只应用其中一种?

下面是我的一段代码:

代码语言:javascript
运行
复制
Scaffold(
    topBar = { },
    bottomBar = { },
    modifier = Modifier
        .systemBarsPadding()
) { innerPadding ->
    Content(
        modifier = Modifier
            .padding(innerPadding)
            .imePadding()
    )
}

这就是结果:

对于现在不推荐的伴奏元素,我使用了以下解决方案:

代码语言:javascript
运行
复制
val isImeVisible = LocalWindowInsets.current.ime.isVisible
val contentPadding = remember(isImeVisible) {
    if (isImeVisible) PaddingValues(top = innerPadding.calculateTopPadding()) else innerPadding
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-03-31 06:47:27

根据伴奏信息迁移的说法,LocalWindowInsets.current.ime应该被WindowInsets.ime取代。

它目前还没有isVisible,直到这个错误被修复为止。现在我是如何重新创建它的:

代码语言:javascript
运行
复制
val WindowInsets.Companion.isImeVisible: Boolean
    @Composable
    get() {
        val density = LocalDensity.current
        val ime = this.ime
        return remember {
            derivedStateOf {
                ime.getBottom(density) > 0
            }
        }.value
    }

用法:

代码语言:javascript
运行
复制
val isImeVisible = WindowInsets.isImeVisible

这应该适用于旧的remember(isImeVisible)代码。

票数 6
EN

Stack Overflow用户

发布于 2022-07-18 12:04:06

另一个解决方案是将BringIntoViewRequester设置为Scaffold中的内容。然后,当textField集中时,您可以调用bringIntoViewRequester.bringIntoView()。这样你就不需要设置任何垫子。

代码语言:javascript
运行
复制
val bringIntoViewRequester = remember { BringIntoViewRequester() }

Column(
    modifier = Modifier.bringIntoViewRequester(bringIntoViewRequester)
) {
    TextField(
        value = "",
        onValueChange = {},
        modifier = Modifier
            .onFocusEvent {
                if (it.isFocused) {
                    coroutineScope.launch {
                        delay(350)
                        bringIntoViewRequester.bringIntoView()
                    }
                }
            }
    )
}
票数 0
EN

Stack Overflow用户

发布于 2022-11-28 16:49:40

尝试使用这样的方法(警告: consumedWindowInsets是实验性的,但它正在工作):

代码语言:javascript
运行
复制
Scaffold(
    topBar = { },
    bottomBar = { },
    modifier = Modifier
        .systemBarsPadding()
) { innerPadding ->
    Content(
        modifier = Modifier
            .consumedWindowInsets(innerPadding)
            .padding(innerPadding)
            .imePadding()
    )
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71610150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档