我用它是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以下你必须使用与以前相同的方法。
工作原理: 当setDecorFitsSystemWindows为true时 ,框架将检查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
您可以尝试执行以下操作吗?我认为我们现在必须手动添加键盘的填充。
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)
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()中
| 归档时间: |
|
| 查看次数: |
21893 次 |
| 最近记录: |