Jetpack Compose 中的巨大 ime 填充

问题描述 投票:0回答:2

我有一个带有文本字段的固定底部容器。我使用 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)
android android-jetpack-compose ime samsung
2个回答
1
投票

将此行添加到 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))
            }
        }
    }
}

0
投票

我也遇到过这个问题;更具体地说,某些设备似乎会忽略 adjustmentResize,但在 adjustmentResize 旁边添加 imePadding 会导致其他设备将其加倍。

我自己通过以下方式解决了这个问题:

  1. 将清单选项设置为
    android:windowSoftInputMode="adjustNothing"
  2. 在需要的地方设置 imePadding。
  3. 如果在脚手架的内容上设置 imePadding,我还会在 imePadding 之前对这些内容的修饰符调用
    consumeWindowInsets(contentPadding)
    ,否则 contentPadding 将在 imePadding 中额外消耗。

类似:

Scaffold(...){ contentPadding -> 
    Box(
        modifier = Modifier
            .padding(contentPadding)
            .consumeWindowInsets(contentPadding)
            .imePadding()
    ){...}
}

我不能保证这是最佳实践或它在所有情况下都有效,但它对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.