PanelSwitchHelper icon indicating copy to clipboard operation
PanelSwitchHelper copied to clipboard

android15的适配问题

Open zengcanxiang opened this issue 10 months ago • 8 comments

在android15的适配中,如果开启了全屏适配模式。那么这里计算高度就存在问题

var keyboardH = if (imeVisible && hasNavigation) imeHeight - navigationH else imeHeight
            // 发现部分机型键盘可见时,键盘高度返回0,因此这里用已保存的键盘高度
            if (imeVisible && keyboardH == 0) {
                keyboardH = getKeyBoardHeight(context)
            }

这里减去底部栏的高度,反而导致会出现往下偏移,被输入法挡住内容的情况

zengcanxiang avatar Mar 25 '25 07:03 zengcanxiang

很高兴收到您的反馈,能否提供一下你开启全屏适配模式的代码片段,以便我们可以还原你的使用场景。

HeroZ-Dodge avatar Mar 25 '25 07:03 HeroZ-Dodge

@HeroZ-Dodge 我这边是把targetApi改成android15后,在activity里面使用下面代码就行了。

enableEdgeToEdge(
            navigationBarStyle =
            SystemBarStyle.auto(
                Color.TRANSPARENT,
                Color.TRANSPARENT,
            ),
        )

zengcanxiang avatar Mar 25 '25 10:03 zengcanxiang

@zengcanxiang 我在 master-for-android15 分支的demo创建了一个EdgeToEdge的场景,但是没有遇到你描述的情况。这个问题是否与设备兼容有关系。你可以尝试用master-for-android15分支的demo代码调试一下

Image

HeroZ-Dodge avatar Mar 26 '25 09:03 HeroZ-Dodge

@HeroZ-Dodge 好的我切到这个分支尝试复现一下

zengcanxiang avatar Mar 26 '25 10:03 zengcanxiang

@HeroZ-Dodge 跑起来这个分支,看了一下,感觉可能是这个连锁反应导致的。

在未唤醒输入法的时候,demo分支的内容,示例的底部输入框内容会侵入到navigationBar区域

Image

而我这边,为了防止这个问题,我自身的是在这个下面塞入了一个高度的控件,来达到效果。导致顶上去的时候,就有一部分内容被输入法遮挡了。现在我就是在不停的调整这个控件的显隐

Image

而且,我这边面板的效果是,高度和输入法高度一致的,这个和demo中切换面板时,高度会变化不一致。

大概我看到的就是这些差异。

zengcanxiang avatar Apr 08 '25 09:04 zengcanxiang

同样的问题+1

qwer2y avatar Apr 15 '25 06:04 qwer2y

已解决:

  1. 启用enableEdgeToEdge()
  2. 为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
    }
}
  1. 增加了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

qwer2y avatar Apr 15 '25 10:04 qwer2y

已解决:

  1. 启用enableEdgeToEdge()
  2. 为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
    }
}
  1. 增加了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步处理。

davidgerka avatar Aug 18 '25 04:08 davidgerka