android15的适配问题
在android15的适配中,如果开启了全屏适配模式。那么这里计算高度就存在问题
var keyboardH = if (imeVisible && hasNavigation) imeHeight - navigationH else imeHeight
// 发现部分机型键盘可见时,键盘高度返回0,因此这里用已保存的键盘高度
if (imeVisible && keyboardH == 0) {
keyboardH = getKeyBoardHeight(context)
}
这里减去底部栏的高度,反而导致会出现往下偏移,被输入法挡住内容的情况
很高兴收到您的反馈,能否提供一下你开启全屏适配模式的代码片段,以便我们可以还原你的使用场景。
@HeroZ-Dodge 我这边是把targetApi改成android15后,在activity里面使用下面代码就行了。
enableEdgeToEdge(
navigationBarStyle =
SystemBarStyle.auto(
Color.TRANSPARENT,
Color.TRANSPARENT,
),
)
@zengcanxiang 我在 master-for-android15 分支的demo创建了一个EdgeToEdge的场景,但是没有遇到你描述的情况。这个问题是否与设备兼容有关系。你可以尝试用master-for-android15分支的demo代码调试一下
@HeroZ-Dodge 好的我切到这个分支尝试复现一下
@HeroZ-Dodge 跑起来这个分支,看了一下,感觉可能是这个连锁反应导致的。
在未唤醒输入法的时候,demo分支的内容,示例的底部输入框内容会侵入到navigationBar区域
而我这边,为了防止这个问题,我自身的是在这个下面塞入了一个高度的控件,来达到效果。导致顶上去的时候,就有一部分内容被输入法遮挡了。现在我就是在不停的调整这个控件的显隐
而且,我这边面板的效果是,高度和输入法高度一致的,这个和demo中切换面板时,高度会变化不一致。
大概我看到的就是这些差异。
同样的问题+1
已解决:
- 启用enableEdgeToEdge()
- 为PanelSwitchLayout增加NavigationBar的bottomPadding:
panelSwitchLayout.navigationBarPadding()
fun View.navigationBarPadding() {
var isConsumed = false
ViewCompat.setOnApplyWindowInsetsListener(this) { v, insets ->
if (!isConsumed) {
val bars = insets.getInsets(
WindowInsetsCompat.Type.navigationBars()
)
v.updatePadding(
left = paddingLeft + bars.left,
top = paddingTop + bars.top,
right = paddingRight + bars.right,
bottom = paddingBottom + bars.bottom,
)
if (v is RecyclerView) v.clipToPadding = false
isConsumed = true
}
WindowInsetsCompat.CONSUMED
}
}
- 增加了padding之后在PanelSwitchLayout类中keyboardChangedAnimation()方法中的onProgress()回调方法将
var softInputHeight = insets.getInsets(WindowInsetsCompat.Type.ime()).bottom // 键盘高度,这个高度包含了导航栏
改为
var softInputHeight = insets.getInsets(WindowInsetsCompat.Type.ime()).bottom - insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom // 键盘高度,这个高度包含了导航栏
重点在于现在要减去导航栏的bottomPadding
已解决:
- 启用enableEdgeToEdge()
- 为PanelSwitchLayout增加NavigationBar的bottomPadding:
panelSwitchLayout.navigationBarPadding() fun View.navigationBarPadding() { var isConsumed = false ViewCompat.setOnApplyWindowInsetsListener(this) { v, insets -> if (!isConsumed) { val bars = insets.getInsets( WindowInsetsCompat.Type.navigationBars() ) v.updatePadding( left = paddingLeft + bars.left, top = paddingTop + bars.top, right = paddingRight + bars.right, bottom = paddingBottom + bars.bottom, ) if (v is RecyclerView) v.clipToPadding = false isConsumed = true } WindowInsetsCompat.CONSUMED } }
- 增加了padding之后在PanelSwitchLayout类中keyboardChangedAnimation()方法中的onProgress()回调方法将
var softInputHeight = insets.getInsets(WindowInsetsCompat.Type.ime()).bottom // 键盘高度,这个高度包含了导航栏改为
var softInputHeight = insets.getInsets(WindowInsetsCompat.Type.ime()).bottom - insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom // 键盘高度,这个高度包含了导航栏重点在于现在要减去导航栏的bottomPadding
我在panelSwitchLayout外面包一层FrameLayout,对FrameLayout设置PaddingBottom就可以了,不用做你这里的第3步处理。