首页 > 解决方案 > Jetpack 撰写 LazyColumn 或 Scrollable Column 和 TextField 的 IME 填充不起作用

问题描述

我正在尝试设置一个文本字段列表,当用户将焦点设置在底部的一个文本字段上时,我希望用户可以看到出现的 IME 软键盘和根据我的清单中设置的配置填充的文本字段文件android:windowSoftInputMode="adjustPan",但它第一次不起作用,它仅在列出的某些文本字段已经具有焦点时才起作用。

视频中的行为。

我在 onCreate 方法中的代码。

    // Turn off the decor fitting system windows, which allows us to handle insets,
    // including IME animations
    WindowCompat.setDecorFitsSystemWindows(window, false)

    setContent {

        // Provide WindowInsets to our content. We don't want to consume them, so that
        // they keep being pass down the view hierarchy (since we're using fragments).
        ProvideWindowInsets(consumeWindowInsets = false) {

            MyApplicationTheme {

                // A surface container using the 'background' color from the theme
                Surface(color = MaterialTheme.colors.background, modifier = Modifier.systemBarsPadding()) {

                    Column(modifier = Modifier.fillMaxHeight()) {

                        val list: List<@Composable () -> Unit> = (1..10).map {
                            {

                                Text(text = "$it")

                                Divider()

                                TextField(value = "", onValueChange = {}, modifier = Modifier.navigationBarsWithImePadding(),)
                            }
                        }

                        LazyColumn(modifier = Modifier.fillMaxSize().weight(1F)) {

                            itemsIndexed(list) { index, inputText ->

                                inputText()
                            }
                        }
                    }
                }
            }
        }
    }

标签: android-softkeyboardandroid-jetpack-composeimelazylist

解决方案


如果您的问题仍然存在,请检查Jetpack Compose 的插图

仅添加此依赖项:

implementation 'com.google.accompanist:accompanist-insets:{insetsVersion}'

并使用Modifier.imePadding()或自定义解决方案:

@Composable
fun ImeAvoidingBox() {
    val insets = LocalWindowInsets.current

    val imeBottom = with(LocalDensity.current) { insets.ime.bottom.toDp() }
    Box(Modifier.padding(bottom = imeBottom))
}

推荐阅读