首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android M ClassCastException: FrameLayout$LayoutParams不能转换为WindowManager$LayoutParams

Android M ClassCastException: FrameLayout$LayoutParams不能转换为WindowManager$LayoutParams
EN

Stack Overflow用户
提问于 2016-03-19 04:02:22
回答 2查看 1.9K关注 0票数 3

这段代码似乎可以在android api 16 - 22中工作,但在api 23中不能工作。我只是试图显示一个带有选项的弹出窗口,并使弹出窗口下面的背景变暗:

代码语言:javascript
复制
                WindowPopUp windowPopUp =
                        new WindowPopUp(mContext, mPlaces.get(position), position, fromSearch);
                windowPopUp.showAtLocation(v, Gravity.CENTER, 0, 0);
                View parent = (View) windowPopUp.getContentView().getParent();
                //dim the window in the background
                WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
                WindowManager.LayoutParams p = (WindowManager.LayoutParams) parent.getLayoutParams();
                p.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND;
                p.dimAmount = 0.4f;
                wm.updateViewLayout(parent, p);

运行此代码会导致错误:

代码语言:javascript
复制
                03-18 21:55:19.674 8814-8814/? E/AndroidRuntime: FATAL EXCEPTION: main
                                             Process: com.myapp, PID: 8814
                                             java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.view.WindowManager$LayoutParams
                                                 at com.bemyapp.adapter.OuterPlaceAdapter$5.onLongClick(OuterPlaceAdapter.java:400)
                                                 at android.view.View.performLongClick(View.java:5237)
                                                 at android.view.View$CheckForLongPress.run(View.java:21121)
                                                 at android.os.Handler.handleCallback(Handler.java:739)
                                                 at android.os.Handler.dispatchMessage(Handler.java:95)
                                                 at android.os.Looper.loop(Looper.java:148)
                                                 at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

哪里出了问题?

据我所知,WindowManager.LayoutParams扩展了ViewGroup.LayoutParams,当我调用parent.getLayoutParams()时,它返回一个ViewGroup.LayoutParams,所以不应该有classCastException

EN

回答 2

Stack Overflow用户

发布于 2016-04-06 19:29:20

只需再添加一个.getParent()来访问容器即可。

代码语言:javascript
复制
 if (android.os.Build.VERSION.SDK_INT > 22) {
            container = (View) pwindow.getContentView().getParent().getParent();
        }else{
            container = (View) pwindow.getContentView().getParent();
        }
票数 10
EN

Stack Overflow用户

发布于 2016-03-19 04:08:17

有一个类类型转换异常。您正在将ViewGroup.LayoutParams转换为WindowManager.LayoutParams。如果返回的实际对象是ViewGroup.LayoutParams的另一个子对象(例如,FrameLayout.LayoutParams)的实例,则强制转换是非法的。在本例中,名为parent的视图不是直接在窗口中,而是在FrameLayout中。所以调用getLayoutParams会返回一个FrameLayout.LayoutParams,而不是一个WindowsManager.LayoutParams

如果它在22中工作,而不是在23中工作,那么很可能他们在23中改变了弹出窗口的制作方式。依赖于父弹出窗口直接位于窗口内部从来都不是一个安全的假设,您的代码总是有被操作系统更新破坏的风险。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36093254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档