当前位置: 首页 > 知识库问答 >
问题:

软件键盘与jetpack compose视图的内容重叠

羊慈
2023-03-14

假设我有一些关于jetpack-compose内容的活动

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")
                }
            }
        }
    }

}

如果我要启动此活动并专注于文本字段,就会弹出一个软件键盘。

但是,该接口不会对此做出反应。可滚动列的下边框(.border(4.dp,Color.Red))以及第100个项目(Text(“Item #$i”))将不可见。

换句话说,软键盘与内容重叠。

如何使jetpack在可见区域发生变化(由于软件键盘)?

共有3个答案

陶锋
2023-03-14

我也面临同样的问题。

使用<code>OnGlobalLayoutListener</code>将观察实际的输入法矩形大小,并在软键盘完全可见时触发。

适用于我的解决方案:

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),
    ...
)

起源于这里

宓季同
2023-03-14

您可以使用陪同者的插图库https://google.github.io/accompanist/insets

首先,在应用程序主题下的大多数情况下,在可组合层次结构的根位置使用ProvideWinSet,然后将WindowInsetsAnimationEnabled设置为true

ProvideWindowInsets(windowInsetsAnimationsEnabled = true) {
// content  }

在TextField上使用NavigationBarswithImePadd()修饰符

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

最后,请确保从您的活动(在onCreate内部)调用WindowCompat.setDecorFitsSystemWindows(window,false)。如果您希望软件键盘开/关动画设置活动的窗口SoftInputMode adjust在Android中调整大小

<activity
  android:name=".MyActivity"
  android:windowSoftInputMode="adjustResize">
周玺
2023-03-14

您可以使用标准的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 */ }
    }
}

否则,您可以使用清单中的标志。有关更多信息,请参阅此处:在显示软键盘时向上移动布局?

 类似资料:
  • 我们正在做一个类似Whatsapp的应用程序,所以我们展示了一个表情面板或软键盘。我们正在使用adjustResize,因为我们需要获得软键盘的高度(为了确保表情面板与软键盘具有相同的高度),一切都正常,但是,当从表情面板更改为键盘时,我们看到edittext如何到达底部,然后随着软键盘上升。 在显示软键盘时,如何修复edittext?在显示键盘之前,我曾考虑过从adjustResize更改为ad

  • 我在UIView的底部有一个文本视图,所以当触摸文本视图并且键盘显示时,键盘会阻止文本视图。我该如何解决这个问题?当键盘显示时,我可以让整个UIView向上移动吗?这样键盘就不会阻止任何东西

  • 我的列表视图底部有一个编辑文本。当我点击编辑文本时,软键盘如预期的那样弹出,同时listview向上滑动,将编辑文本放置在键盘上方。然而,一旦我开始输入,ListView就会滑回来,EditText现在位于软键盘后面,挡住了输入的视图。我仍然可以打字,但是编辑文本被软键盘覆盖了。 如何使编辑文本在键盘上方可见? PS。我正在使用adjustPan 编辑:这是一个与我面临的问题相同的人的链接,但我看

  • 我正在为用户编写一个选择国家的过程。我有一个edittext链接到适配器,显示所有可用选项。 在我的清单中,我将活动设置为 android: windowSoftInputMode="stateAlwaysHidden" 我需要完全禁用软键盘。 除了一种情况外,它工作正常。如果用户长时间点击/按下编辑文本,键盘就会弹出。 有没有办法通过使用代码或在清单中永久禁用特定活动中的键盘? 我的代码: 我的

  • 问题内容: 这个问题已经在这里有了答案 : 如何查看文件中的更改? (25个答案) 7年前关闭。 我正在寻找一个跨平台的文件监视python包?我知道可以使用pywin32监视Windows上的文件,并且有可以在Linux / Unix上运行的软件包,但是有人知道跨平台的吗? 问题答案: 对于基于Unix / Linux的系统,您应该使用File Alteration Monitor Python

  • 我有带有edittext字段的自定义模板。当我点击软键盘上的“下一步”按钮时,它只移动了两次焦点--比按钮变成了“确定”。清单有12项。有没有办法导航到所有的项目,而不仅仅是2?你能帮帮我吗? 公共视图getView(int position,View convertView,ViewGroup parent){ }