razerdp/BasePopup

java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to android.view.WindowManager$LayoutParams

Xiaa520 opened this issue · 18 comments

该问题是怎么引起的?

at android.widget.PopupWindow$1.onScrollChanged(PopupWindow.java:149)
at android.view.ViewTreeObserver.dispatchOnScrollChanged(ViewTreeObserver.java:1016)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2464)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2396)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2026)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1104)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5962)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:794)
at android.view.Choreographer.doCallbacks(Choreographer.java:607)
at android.view.Choreographer.doFrame(Choreographer.java:577)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:780)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5296)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707)

重现步骤

报错信息/系统版本

建议或优化点

java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to android.view.WindowManager$LayoutParams
at android.widget.PopupWindow.getDecorViewLayoutParams(PopupWindow.java:2282)
at android.widget.PopupWindow.alignToAnchor(PopupWindow.java:2427)
at android.widget.PopupWindow.lambda$-android_widget_PopupWindow_10383(PopupWindow.java:262)
at android.widget.-$Lambda$ISuHLqeK-K4pmesAfzlFglc3xF4$1.$m$0(Unknown Source:17)
at android.widget.-$Lambda$ISuHLqeK-K4pmesAfzlFglc3xF4$1.onLayoutChange(Unknown Source:0)
at android.view.View.layout(View.java:19799)
at android.view.ViewGroup.layout(ViewGroup.java:6144)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2653)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2356)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1512)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7218)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:981)
at android.view.Choreographer.doCallbacks(Choreographer.java:790)
at android.view.Choreographer.doFrame(Choreographer.java:721)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:967)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:101)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:7415)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)

相同的错误吧

@XZWQuickness
@ParfoisMeng

请问是什么版本,以及复现步骤

小米2a 版本5.1.1 多次显示showPopupWindow 销毁dismiss 就会出现

好的,我尽快解决

@razerdp 我这边是,dismiss的时候,对activity里的recycleview的adapter做刷新notifyDataSetChanged,崩溃。如果让notifyDataSetChanged延迟几秒就没事。感觉应该是pop未完全销毁前,操作activity内布局刷新导致

其实是跟一个滑动有关大概,因为popup内部有监听scroll事件(用于将popup与anchorView对齐的)

而因为popup给add到windowmanager时用的是WindowManager.LayoutParams,而我这边因为hack掉windowmanager同时在addView时,给内部的decorView再加一层,导致了一个问题,就是两边的layoutParams可能不一致。

详情定位到:

popupwindow-> alignToAnchor()方法源码点我

外部scroll时回调到scrolllistener,其内部有获取layoutParams方法

final WindowManager.LayoutParams p = getDecorViewLayoutParams();

这里因为decorView被我add到了hackpopupdecorView,因此被我转为了viewGroup的LayoutParams,这里报错可能是因为向下转型的问题,目前解决方案我来想想哈。。。

hackwindowmanager

@razerdp 1.8.2没问题,1.9.2崩溃,中间版本未测试。

嗯呐,1.9.1开始用windowmanager代理这个方法,当时自己测试也没遇到这个问题,现在遇到的话我在下个版本解决哈~

顺便问下- -崩溃频率高不高

我也遇到这个问题了, 挺容易触发的.

信息

BasePopup:1.9.2;
手机魅蓝note5, android6.0,

重新步骤

1.showPopupWindow(view);
2. 点击空白, pop消失

反复几次就crash了.

我也遇到了哈
当同个页面 有一个textview setSelected(true)(由于文字太长 文字横向滚动 跑马灯效果)
这时候点击显示popupwindow 会报这个错误

还有个问题顺便反馈下 - -

新版本 1.9.2 input类型的popupwindow 不会自动随输入法 而弹到上方 如果屏幕太小 输入法会遮住popupwindow

@razerdp 我那样的使用方式操作流程,崩溃是必现的。他们的问题不清楚是否必现,但概率应该都很高

@Mr-PolarBear

那个输入法的问题是跟全屏有关的,因为popupHelper默认全屏(N以上可以把popup覆盖到状态栏)BasePopupHelper#50HackWindowmanager#180

所以布局无法顶上去,又因为这个跟activity全屏一样,当设置为全屏flag LayoutParams.FLAG_LAYOUT_IN_SCREEN时,输入法就已经是由window来控制了,所以布局无法resize,这个问题暂时无解

目前来说,可以禁用全屏来折中:

popup.setPopupWindowFullScreen(false);

@XZWQuickness
@ParfoisMeng
@liaolintao
@bryant1410

感谢你们的反馈,新版本已经修复强转问题了,请更新到1.9.3 (ps,我是在模拟器测试的,没有测试到4.1~4.2)

已解决, 谢谢!

验证步骤

1.在外侧滚动RecyclerView
2.在RecyclerView还未停下来的时候, showPopupWindow(view)

3Q,如果还有什么问题欢迎提交issue哦

我也遇到了哈 ,调试了一下午,模拟器没问题 ,小米手机 必现。唉。。来这看看 结果是库引起的。
更新后 发现一个问题
选中RecyclerView 某一行后 原来在底部,一下 就全屏了。

@yang0000meng 你好,可以开个新的issue具体描述下吗。。。。。还有重现方案-

recyclerview在demo中DismissControlPopupFrag也有哦。

吓得我赶紧升级1.9.3