BottomSheetDialog中弹出BasePopup显示异常
JasonLian2020 opened this issue · 13 comments
- 系统版本:Android 8.0 华为P9
- 库版本:2.2.1
- 问题描述/重现步骤:Activity下先弹窗BottomSheetDialog,然后再弹出BasePopup,此时现象是BasePopup在Activity之上,在BottomSheetDialog之下。
- 问题代码/截图:
- 报错信息:无
//布局&动画
@Override
public View onCreateContentView() {
return createPopupById(R.layout.public_popup_more);
}
@Override
protected Animation onCreateShowAnimation() {
return getTranslateVerticalAnimation(1f, 0, 250);
}
@Override
protected Animation onCreateDismissAnimation() {
return getTranslateVerticalAnimation(0, 1f, 250);
}
//BasePopupWindow调用方式
showPopupWindow();
请加support支持库.
类似的情况其实就是因为windowToken的问题,构造器传入的context,我们使用的是context也就是activity的windowToken,而因为你是在dialog里面弹窗,而dialog是自有window的,popup则是依赖当前的windowToken,也正是因为这样,所以在dialog里面弹窗,popup用的依然是activity的windowToken,自然而然的该popup会在dialog下层。
所以我提供了support库针对dialogfragment的处理。
请加support支持库.
我的接入方式是如下~
basePopupSdkVersion : "2.2.1"
"com.github.razerdp:BasePopup:${version["basePopupSdkVersion"]}",//BasePopup主体库
"com.github.razerdp:BasePopup-compat-support:${version["basePopupSdkVersion"]}",//BasePopup support支持库(如支持DialogFragment里弹Popup时的层序支持)
"com.github.razerdp:BasePopup-compat-lifecycle:${version["basePopupSdkVersion"]}",//BasePopup lifecycle支持库(如自动适配Activity/Fragment生命期dismiss/回收等)
类似的情况其实就是因为windowToken的问题,构造器传入的context,我们使用的是context也就是activity的windowToken,而因为你是在dialog里面弹窗,而dialog是自有window的,popup则是依赖当前的windowToken,也正是因为这样,所以在dialog里面弹窗,popup用的依然是activity的windowToken,自然而然的该popup会在dialog下层。
所以我提供了support库针对dialogfragment的处理。
我这里不是弹出DialogFragment,我弹出的是BottomSheetDialog.java噢,还是没法解决,问题是同一个。
ya,但他们出错的原理都是一样的.....
ya,但他们出错的原理都是一样的.....
了解,看了源码,你的support只是针对解决了DialogFragment的情况,现在有什么方式可以临时处理我现在这种情况
上面截图我给了,重写onFindDecorView,把你的dialog的rootview返回给basepopup,让其获取到正确的windowToken
上面截图我给了,重写onFindDecorView,把你的dialog的rootview返回给basepopup,让其获取到正确的windowToken
好的,刚刚刷太快没看到,非常感谢~
虽然是麻烦了点......但当前版本只能这么干了,目前来说我倒是比较建议你在popup里写个接口,在重写的方法里返回接口返回的view,伪代码如下:
listenre rootViewProvider{
View onProvideRootView()
}
@override
view onFindedView(){
if (rootViewProvider ! = null){
return rootViewProvider.onProvideRootView()
}
}
后续版本我会去针对这一些进行优化,到时候更新完你删掉这个接口就行,而不需要把bottomSheet传进来
虽然是麻烦了点......但当前版本只能这么干了,目前来说我倒是比较建议你在popup里写个接口,在重写的方法里返回接口返回的view,伪代码如下:
listenre rootViewProvider{ View onProvideRootView() } @override view onFindedView(){ if (rootViewProvider ! = null){ return rootViewProvider.onProvideRootView() } }后续版本我会去针对这一些进行优化,到时候更新完你删掉这个接口就行,而不需要把bottomSheet传进来
没问题~
下个版本将会优化
同时测试用例已经添加到Demo中