Android15的BottomPopupView会被导航栏遮挡
XPopup版本 如2.10.0
手机系统和型号 任何安卓手机 Android 15
描述你的问题
bottom弹窗会被导航栏遮挡,100%出现,低版本不会
弹出的代码如下 new XPopup.Builder(getActivity()) .moveUpToKeyboard(false) .isCenterHorizontal(true) .asCustom(popupView) .show();
XPopup版本 如2.10.0
手机系统和型号 任何安卓手机 Android 15
描述你的问题 bottom弹窗会被导航栏遮挡,100%出现,低版本不会
弹出的代码如下 new XPopup.Builder(getActivity()) .moveUpToKeyboard(false) .isCenterHorizontal(true) .asCustom(popupView) .show();
那应该是 Android 15 edge-to-edge 得埚了
XPopup版本 如2.10.0 手机系统和型号 任何安卓手机 Android 15 描述你的问题 bottom弹窗会被导航栏遮挡,100%出现,低版本不会
弹出的代码如下 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
}
这个有解决办法吗
设置弹窗的offSetY
设置弹窗的offSetY
我发现这个框架弹窗,会出现小白条,现在在Android14上面使用edge-to-edge,我的页面已经全面屏,只要弹窗出来,特别是底部的弹窗,出来之后小白条也出现了。这个弹窗组件还没适配全面屏。目前还没有时间看代码,应该怎么改,只能换其他弹窗了。 我现在项目是全面屏设计的,把内容嵌入到状态栏,导航栏中,弹窗也是这样,然后根据导航栏高度,弹窗底部自己做边距。
设置弹窗的offSetY
我发现这个框架弹窗,会出现小白条,现在在Android14上面使用edge-to-edge,我的页面已经全面屏,只要弹窗出来,特别是底部的弹窗,出来之后小白条也出现了。这个弹窗组件还没适配全面屏。目前还没有时间看代码,应该怎么改,只能换其他弹窗了。 我现在项目是全面屏设计的,把内容嵌入到状态栏,导航栏中,弹窗也是这样,然后根据导航栏高度,弹窗底部自己做边距。
是的,这需要修改这个框架内部实现的Dialog才能实现edge-to-edge的效果了。目前我在使用使用框架在遇到这个底部导航遮挡问题我都是给弹窗设置hasNavigationBar(false)来暂时解决了。有什么其它好的弹窗框架安利吗
设置弹窗的offSetY
我发现这个框架弹窗,会出现小白条,现在在Android14上面使用edge-to-edge,我的页面已经全面屏,只要弹窗出来,特别是底部的弹窗,出来之后小白条也出现了。这个弹窗组件还没适配全面屏。目前还没有时间看代码,应该怎么改,只能换其他弹窗了。 我现在项目是全面屏设计的,把内容嵌入到状态栏,导航栏中,弹窗也是这样,然后根据导航栏高度,弹窗底部自己做边距。
是的,这需要修改这个框架内部实现的Dialog才能实现edge-to-edge的效果了。目前我在使用使用框架在遇到这个底部导航遮挡问题我都是给弹窗设置hasNavigationBar(false)来暂时解决了。有什么其它好的弹窗框架安利吗
经过我的测试,这个框架配套frameworkbase,可以做到https://github.com/kongzue/DialogX,不是打广告,不是引战
.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
我是手动裁剪的源码(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;
}
});
}
我是手动裁剪的源码(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; } }); }
可是这样会导致弹窗的高度不准
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;
}
});这个可以
可以试下我的方案 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() } } }
这是来自QQ邮箱的假期自动回复邮件。 您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
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的原有的内边距来调整外边距呢?
这是来自QQ邮箱的假期自动回复邮件。 您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
想让输入框吸附在键盘上,用bottompop适配有问题。有什么好方案吗
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的原有的内边距来调整外边距呢?
因为体验更好
