XPopup icon indicating copy to clipboard operation
XPopup copied to clipboard

Android15的BottomPopupView会被导航栏遮挡

Open LexLEEway opened this issue 1 year ago • 20 comments

XPopup版本 如2.10.0

手机系统和型号 任何安卓手机 Android 15

描述你的问题 bottom弹窗会被导航栏遮挡,100%出现,低版本不会 PixPin_2024-12-27_17-16-01

弹出的代码如下 new XPopup.Builder(getActivity()) .moveUpToKeyboard(false) .isCenterHorizontal(true) .asCustom(popupView) .show();

LexLEEway avatar Dec 27 '24 09:12 LexLEEway

XPopup版本 如2.10.0

手机系统和型号 任何安卓手机 Android 15

描述你的问题 bottom弹窗会被导航栏遮挡,100%出现,低版本不会 PixPin_2024-12-27_17-16-01

弹出的代码如下 new XPopup.Builder(getActivity()) .moveUpToKeyboard(false) .isCenterHorizontal(true) .asCustom(popupView) .show();

那应该是 Android 15 edge-to-edge 得埚了

zhangzhen1129 avatar Dec 31 '24 10:12 zhangzhen1129

XPopup版本 如2.10.0 手机系统和型号 任何安卓手机 Android 15 描述你的问题 bottom弹窗会被导航栏遮挡,100%出现,低版本不会 PixPin_2024-12-27_17-16-01 弹出的代码如下 new XPopup.Builder(getActivity()) .moveUpToKeyboard(false) .isCenterHorizontal(true) .asCustom(popupView) .show();

那应该是 Android 15 edge-to-edge 得埚了

这个需要你给底部的布局添加系统navigatorBar的padding来处理

ViewCompat.setOnApplyWindowInsetsListener(view) { v, insets ->
            val systemInsets = insets.getInsets(WindowInsetsCompat.Type.navigationBars())
            v.setPadding(0, 0, 0, systemInsets.bottom)
            insets
        }

LiuPack avatar Jan 02 '25 09:01 LiuPack

这个有解决办法吗

yyhhjjj avatar Jan 24 '25 02:01 yyhhjjj

设置弹窗的offSetY

GarbageCan1024 avatar Feb 12 '25 10:02 GarbageCan1024

设置弹窗的offSetY

我发现这个框架弹窗,会出现小白条,现在在Android14上面使用edge-to-edge,我的页面已经全面屏,只要弹窗出来,特别是底部的弹窗,出来之后小白条也出现了。这个弹窗组件还没适配全面屏。目前还没有时间看代码,应该怎么改,只能换其他弹窗了。 我现在项目是全面屏设计的,把内容嵌入到状态栏,导航栏中,弹窗也是这样,然后根据导航栏高度,弹窗底部自己做边距。

df13954 avatar Mar 12 '25 03:03 df13954

设置弹窗的offSetY

我发现这个框架弹窗,会出现小白条,现在在Android14上面使用edge-to-edge,我的页面已经全面屏,只要弹窗出来,特别是底部的弹窗,出来之后小白条也出现了。这个弹窗组件还没适配全面屏。目前还没有时间看代码,应该怎么改,只能换其他弹窗了。 我现在项目是全面屏设计的,把内容嵌入到状态栏,导航栏中,弹窗也是这样,然后根据导航栏高度,弹窗底部自己做边距。

是的,这需要修改这个框架内部实现的Dialog才能实现edge-to-edge的效果了。目前我在使用使用框架在遇到这个底部导航遮挡问题我都是给弹窗设置hasNavigationBar(false)来暂时解决了。有什么其它好的弹窗框架安利吗

GarbageCan1024 avatar Mar 12 '25 10:03 GarbageCan1024

设置弹窗的offSetY

我发现这个框架弹窗,会出现小白条,现在在Android14上面使用edge-to-edge,我的页面已经全面屏,只要弹窗出来,特别是底部的弹窗,出来之后小白条也出现了。这个弹窗组件还没适配全面屏。目前还没有时间看代码,应该怎么改,只能换其他弹窗了。 我现在项目是全面屏设计的,把内容嵌入到状态栏,导航栏中,弹窗也是这样,然后根据导航栏高度,弹窗底部自己做边距。

是的,这需要修改这个框架内部实现的Dialog才能实现edge-to-edge的效果了。目前我在使用使用框架在遇到这个底部导航遮挡问题我都是给弹窗设置hasNavigationBar(false)来暂时解决了。有什么其它好的弹窗框架安利吗

经过我的测试,这个框架配套frameworkbase,可以做到https://github.com/kongzue/DialogX,不是打广告,不是引战

df13954 avatar Mar 12 '25 10:03 df13954

.setPopupCallback(object : SimpleCallback() { override fun onCreated(popupView: BasePopupView?) { popupView?.setPadding(0, 0, 0, bottom) } }) bottom为 ViewCompat.setOnApplyWindowInsetsListener(main) { v, insets -> systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) systemBars?.let { v.setPadding(it.left, it.top, it.right, it.bottom) } insets } insets的bottom

RokingYang avatar Apr 22 '25 02:04 RokingYang

我是手动裁剪的源码(java) , 在BottomPopupView中加入了下面的代码也可以了:

protected void addInnerContent(){
        View contentView = LayoutInflater.from(getContext()).inflate(getImplLayoutId(), bottomPopupContainer, false);
        bottomPopupContainer.addView(contentView);
        //底部弹窗要留出一个状态栏的高度
        ViewCompat.setOnApplyWindowInsetsListener(this, new androidx.core.view.OnApplyWindowInsetsListener() {
            @NonNull
            @Override
            public WindowInsetsCompat onApplyWindowInsets(@NonNull View v, @NonNull WindowInsetsCompat insets) {
                Insets systemInsets = insets.getInsets(WindowInsetsCompat.Type.navigationBars());
                v.setPadding(0, 0, 0, systemInsets.bottom);
                return insets;
            }
        });
    }

rainfoam avatar Apr 25 '25 08:04 rainfoam

我是手动裁剪的源码(java) , 在BottomPopupView中加入了下面的代码也可以了:

protected void addInnerContent(){ View contentView = LayoutInflater.from(getContext()).inflate(getImplLayoutId(), bottomPopupContainer, false); bottomPopupContainer.addView(contentView); //底部弹窗要留出一个状态栏的高度 ViewCompat.setOnApplyWindowInsetsListener(this, new androidx.core.view.OnApplyWindowInsetsListener() { @NonNull @Override public WindowInsetsCompat onApplyWindowInsets(@NonNull View v, @NonNull WindowInsetsCompat insets) { Insets systemInsets = insets.getInsets(WindowInsetsCompat.Type.navigationBars()); v.setPadding(0, 0, 0, systemInsets.bottom); return insets; } }); }

可是这样会导致弹窗的高度不准

xhh1993 avatar May 07 '25 12:05 xhh1993

      ViewCompat.setOnApplyWindowInsetsListener(this, new androidx.core.view.OnApplyWindowInsetsListener() {
            @NonNull
            @Override
            public WindowInsetsCompat onApplyWindowInsets(@NonNull View v, @NonNull WindowInsetsCompat insets) {
                int bottomInset = insets.getSystemWindowInsetBottom();
                MarginLayoutParams layoutParams = (MarginLayoutParams) v.getLayoutParams();
                layoutParams.setMargins(v.getPaddingLeft(), v.getPaddingTop(), v.getRight(), v.getPaddingBottom() + bottomInset);
                return insets;
            }
        });这个可以

zhi936689039 avatar Sep 11 '25 07:09 zhi936689039

可以试下我的方案 open class BaseBottomPopupView(context: Context) : BottomPopupView(context) { override fun doAfterShow() { super.doAfterShow() val decorView = this.hostWindow?.decorView decorView?.apply { ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets -> val system = insets.getInsets(WindowInsetsCompat.Type.systemBars()) [email protected]( system.left, 0, system.right, system.bottom ) insets } requestApplyInsets() } } }

BreezeAndMoon avatar Sep 18 '25 07:09 BreezeAndMoon

这是来自QQ邮箱的假期自动回复邮件。   您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。

zhi936689039 avatar Sep 18 '25 07:09 zhi936689039

      ViewCompat.setOnApplyWindowInsetsListener(this, new androidx.core.view.OnApplyWindowInsetsListener() {
            @NonNull
            @Override
            public WindowInsetsCompat onApplyWindowInsets(@NonNull View v, @NonNull WindowInsetsCompat insets) {
                int bottomInset = insets.getSystemWindowInsetBottom();
                MarginLayoutParams layoutParams = (MarginLayoutParams) v.getLayoutParams();
                layoutParams.setMargins(v.getPaddingLeft(), v.getPaddingTop(), v.getRight(), v.getPaddingBottom() + bottomInset);
                return insets;
            }
        });这个可以

@zhi936689039
layoutParams.setMargins(v.getPaddingLeft(), v.getPaddingTop(), v.getRight(), v.getPaddingBottom() + bottomInset); 为什么是使用View的原有的内边距来调整外边距呢?

feer921 avatar Oct 13 '25 12:10 feer921

这是来自QQ邮箱的假期自动回复邮件。   您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。

zhi936689039 avatar Oct 13 '25 12:10 zhi936689039

想让输入框吸附在键盘上,用bottompop适配有问题。有什么好方案吗

hcyAndroid avatar Oct 21 '25 02:10 hcyAndroid

      ViewCompat.setOnApplyWindowInsetsListener(this, new androidx.core.view.OnApplyWindowInsetsListener() {
            @NonNull
            @Override
            public WindowInsetsCompat onApplyWindowInsets(@NonNull View v, @NonNull WindowInsetsCompat insets) {
                int bottomInset = insets.getSystemWindowInsetBottom();
                MarginLayoutParams layoutParams = (MarginLayoutParams) v.getLayoutParams();
                layoutParams.setMargins(v.getPaddingLeft(), v.getPaddingTop(), v.getRight(), v.getPaddingBottom() + bottomInset);
                return insets;
            }
        });这个可以

@zhi936689039 layoutParams.setMargins(v.getPaddingLeft(), v.getPaddingTop(), v.getRight(), v.getPaddingBottom() + bottomInset); 为什么是使用View的原有的内边距来调整外边距呢?

因为体验更好

zhi936689039 avatar Oct 21 '25 02:10 zhi936689039