android 软件键盘与jetpack合成视图的内容重叠

anhgbhbe  于 2022-11-20  发布在  Android
关注(0)|答案(8)|浏览(277)

假设我有一些包含jetpack的活动-编写内容

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ScrollableColumn(
                modifier = Modifier
                    .fillMaxSize()
                    .border(4.dp, Color.Red)
            ) {
                val (text, setText) = remember { mutableStateOf("") }

                TextField(
                    value = text,
                    onValueChange = setText,
                    label = {},
                    modifier = Modifier
                        .fillMaxWidth()
                )

                for (i in 0..100) {
                    Text("Item #$i")
                }
            }
        }
    }

}

如果我启动此活动并将焦点放在TextField上,则会弹出一个软件键盘。
但是,接口不会对此做出React。ScrollableColumn的下边框(.border(4.dp, Color.Red))和第100项(Text("Item #$i"))将不可见。
换句话说,软键盘与内容重叠。
我怎样才能使jetpack组合尊重可见区域的变化(由于软键盘)?

58wvjzkj

58wvjzkj1#

您可以使用标准的android程序,但我不知道是否存在特定的合成方式。
如果将SoftInputMode设置为SOFT_INPUT_ADJUST_RESIZE,则布局将根据键盘更改调整大小。

class YourActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        
        window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
        
        setContent { /* Composable Content */ }
    }
}

否则,您可以使用清单中的标志。有关详细信息,请参阅此处:Move layouts up when soft keyboard is shown?

wztqucjr

wztqucjr2#

您可以使用伴奏者的插图库https://google.github.io/accompanist/insets
首先在可组合层次结构的根位置使用 ProvideWindowInsets(大多数情况下位于应用主题下方)compose并将 windowInsetsAnimationsEnabled 设置为true

ProvideWindowInsets(windowInsetsAnimationsEnabled = true) {
// content  }

在文本字段上使用 navigationBarsWithImePadding() 修饰符

OutlinedTextField(
// other params,
modifier = Modifier.navigationBarsWithImePadding() )

最后,确保从Activity(在 onCreate 内)调用 WindowCompat.setDecorFitsSystemWindows(window,false)。如果您希望软件键盘打开/关闭以设置动画,请在AndroidManifests中设置Activity的 *windowSoftInputMode**adjustResize

<activity
  android:name=".MyActivity"
  android:windowSoftInputMode="adjustResize">
3df52oht

3df52oht3#

我也面临同样的问题。
使用OnGlobalLayoutListener,它将观察实际IME矩形大小,并在软键盘完全可见时触发。
对我有效的解决方案:

val bringIntoViewRequester = remember { BringIntoViewRequester() }
val scope = rememberCoroutineScope()
val view = LocalView.current
DisposableEffect(view) {
    val listener = ViewTreeObserver.OnGlobalLayoutListener {
        scope.launch { bringIntoViewRequester.bringIntoView() }
    }
    view.viewTreeObserver.addOnGlobalLayoutListener(listener)
    onDispose { view.viewTreeObserver.removeOnGlobalLayoutListener(listener) }
}
TextField(
    modifier = Modifier.bringIntoViewRequester(bringIntoViewRequester),
    ...
)

此处为原点

kyxcudwk

kyxcudwk4#

我 想出 了 使用 伴奏 插图 库 的 主意 。
有人 可能 会 感 兴趣 , 因为 我 的 方法 * * 不会 修改 * * 应用 程序 的 内容 。
我 在 下面 链接 我 的 帖子 :
( 撰写 UI ) - 键盘 ( IME ) 与 应用 程序 内容 重叠

lvjbypge

lvjbypge5#

除了Compose之外,现在还不需要外部库。在清单文件中的Activity上设置android:windowSoftInputeMode=true
例如:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <application>
        <activity
            android:name=".MyActivity"
            android:windowSoftInputMode="adjustResize"/>
    </application>

</manifest>

然后,对于您希望UI对其作出React的可组合对象,可以使用Modifier.imePadding(),它对IME可见性作出React

Box(Modifier.imePadding()) {
  // content
}
c8ib6hqw

c8ib6hqw6#

如果你想让你的文本字段在键盘出现时向上滚动。下面的方法对我很有效。你需要添加这些

class YourActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
    
    setContent { /* Composable Content */ }
}

并将其添加到您的app/build.gradle

implementation "com.google.accompanist:accompanist-insets-ui:0.24.7-alpha"
6uxekuva

6uxekuva7#

在我的例子中,只需将android:windowSoftInputMode="adjustResize"添加到Activity中就足以解决问题。
这取决于你如何构建你的UI。如果你的屏幕的根是一个垂直滚动的容器或Box,键盘的大小可能会被自动管理。

mbjcgjjk

mbjcgjjk8#

使用修饰符imePadding()。这将允许特定的组合在键盘弹出时进行自我调整。这不需要您在Activity上设置任何标志

相关问题