SOFT_INPUT_ADJUST_RESIZE 在 Android 30 开始已被弃用。

15

我使用SOFT_INPUT_ADJUST_RESIZE来在键盘弹出时展示所有内容。根据文档,我添加了新的代码片段:

I used SOFT_INPUT_ADJUST_RESIZE以便在键盘弹出时显示全部内容。按照文档,我添加了新的代码片段:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    requireActivity().window.setDecorFitsSystemWindows(false)
}

binding.constraintLayoutRoot.setOnApplyWindowInsetsListener { _, windowInsets ->
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        val insets = windowInsets.getInsets(WindowInsets.Type.ime() or WindowInsets.Type.systemGestures())
        insets
    }

    windowInsets
}

由于某些原因,视图不会根据键盘是否出现而调整大小。

6个回答

18
根据Google开发人员从Android API 30开始,他们已经弃用了该方法并为我们提供了解决方案setDecorFitsSystemWindows。但是在Android 30以下版本中,此方法不起作用,你必须像以前一样使用相同的方法。 工作原理:当设置setDecorFitsSystemWindowstrue时,框架将检查SYSTEM_UI_LAYOUT_FLAGS和WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE标志,并根据这些标志调整内容。
但是当它设置为false时,框架将不会将内容视图适应到嵌入式区域,并会检查你的WindowInsets来设置内容视图。
首先,你必须定义可以使用的windowsInsets。
binding.root.setOnApplyWindowInsetsListener { _, windowInsets ->
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            val imeHeight = windowInsets.getInsets(WindowInsets.Type.ime()).bottom
            binding.root.setPadding(0, 0, 0, imeHeight)
        }
        windowInsets
    }

当你想要你的屏幕使用ADJUST_RESIZE时,请将其设置为false。

setDecorFitsSystemWindows(false)

当您想回到正常状态时,请将其设置为true

setDecorFitsSystemWindows(true)

管理 API 30 及以上和以下使用条件

var shouldResize = false // false will resize
    binding.button.setOnClickListener {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            window.setDecorFitsSystemWindows(shouldResize)
            shouldResize = shouldResize.not()
        } else {
            if (shouldResize.not()) {
                window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
            } else {
                window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN)
            }
        }
    }

参考链接:

Android SOFT_INPUT_ADJUST_RESIZE
Android setDecorFitsSystemWindows


2
shouldResize 更新为 shouldResize = shouldResize.not() 的目的是什么? - Bitwise DEVS
哦,太好了。我有一个应用程序,需要在输入文本到一个EditText时以一种方式进行调整,在输入文本到另一个EditText时以不同的方式进行调整,现在我将需要意大利面条式代码来解决它们... - Phlip

7

你能试着按照以下步骤操作,我认为我们现在需要手动添加键盘的填充。

binding.root.setOnApplyWindowInsetsListener { _, windowInsets ->
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        val imeHeight = windowInsets.getInsets(WindowInsets.Type.ime()).bottom
        binding.root.setPadding(0, 0, 0, imeHeight)
        val insets = windowInsets.getInsets(WindowInsets.Type.ime() or WindowInsets.Type.systemGestures())
        insets
    }

    windowInsets
}

1
SDK 30以下的版本会发生什么? - MaaAn13
你已经添加了SDK的检查,对吧?所以我猜它应该正常工作了? - che10

5
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        ViewCompat.setOnApplyWindowInsetsListener(requireDialog().window?.decorView!!) { _, insets ->
            val imeHeight = insets.getInsets(WindowInsetsCompat.Type.ime()).bottom
            val navigationBarHeight =
                insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom
            viewBinding.root.setPadding(0, 0, 0, imeHeight - navigationBarHeight)
            insets
        }
    } else {
        @Suppress("DEPRECATION")
        requireDialog().window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
    }

对于 BottomSheetDialogFragment(),如果您也遇到了同样的问题,请点赞此答案。 对我来说完美运行,已经测试过。 顺便说一下,在 onViewCreated() 中粘贴上述代码。

4

如果您正在使用 BottomSheetDialogFragment,请确保在调用方法时使用 requireDialog().window 而不是 requireActivity().window

。这样可以避免一些潜在的问题,并提高代码的可读性。请注意保留 HTML 标签。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
  requireDialog().window?.let { WindowCompat.setDecorFitsSystemWindows(it, false) }
} else {
  @Suppress("DEPRECATION")
  requireDialog().window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
}

4
最简单的解决方案是将以下内容添加到AndroidManifest.xml中。
<activity
    android:name=".MyActivity"
    android:windowSoftInputMode="adjustResize" />

0

无法将它们与对话框一起使用。 对于活动,藤崎达也的解决方案很好,但是对于要调整大小的对话框,布局需要与父项匹配

val window = this.window
window?.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接