razerdp/BasePopup

BottomSheetDialog中弹出BasePopup显示异常

Closed 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支持库.

@razerdp 类似的情况,麻烦看下 #145 #168

类似的情况其实就是因为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/回收等)

后续则会考虑构造器里传入view来获取当前view所在的windowToken。

当前版本可以通过重写onFindDecorView来获取对应的rootView,进而拿到windowToken。

image

类似的情况其实就是因为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中