SOFT_INPUT_ADJUST_RESIZE 从 android 30 开始已弃用

Pet*_*der 15 android

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

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    requireActivity().window.setDecorFitsSystemWindows(false)
}
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

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

小智 19

根据 Android API 30 的 Google 开发人员的说法,他们已弃用它并为我们提供了解决方法setDecorFitsSystemWindows。但这在Android 30以下不起作用,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
    }
Run Code Online (Sandbox Code Playgroud)

然后当您希望屏幕使用ADUST_RESIZE时设置 false

setDecorFitsSystemWindows(false)
Run Code Online (Sandbox Code Playgroud)

当你想恢复正常时设置 true

setDecorFitsSystemWindows(true)
Run Code Online (Sandbox Code Playgroud)

管理高于和低于 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)
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

参考链接:

Android SOFT_INPUT_ADJUST_RESIZE
Android setDecorFitsSystemWindows

  • 将 `shouldResize` 更新为 `shouldResize = ShouldResize.not()` 有什么意义? (2认同)

che*_*e10 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
}
Run Code Online (Sandbox Code Playgroud)


Dev*_*von 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)
    }
Run Code Online (Sandbox Code Playgroud)

对于BottomSheetDialogFragment(),如果您也面临同样的问题,请喜欢这个答案。经过测试,非常适合我。顺便将上面的代码粘贴到onViewCreated()中