Android M ClassCastException: FrameLayout$LayoutParams cannot be cast to WindowManager$LayoutParams

假如想象 提交于 2019-11-27 15:24:12

问题


This piece of code works seems to work in android api 16 - 22 but does not work in api 23. I'm simply trying to display a popupwindow with options in it and dim the background below the popupwindow:

                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);

Running this code results in an error:

                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)

What has gone wrong?

As far as I know, WindowManager.LayoutParams extends ViewGroup.LayoutParams and when I call parent.getLayoutParams(), it returns a ViewGroup.LayoutParams so there should not be a classCastException.


回答1:


Just add one more .getParent() to access the container.

 if (android.os.Build.VERSION.SDK_INT > 22) {
            container = (View) pwindow.getContentView().getParent().getParent();
        }else{
            container = (View) pwindow.getContentView().getParent();
        }



回答2:


There is a class cast exception. You're casting a ViewGroup.LayoutParams to a WindowManager.LayoutParams. If the actual object returned is an instance of a different child of ViewGroup.LayoutParams (for example, FrameLayout.LayoutParams) then the cast is illegal. In this case the view called parent isn't directly in a window, its inside a FrameLayout. So calling getLayoutParams returns a FrameLayout.LayoutParams, not a WindowsManager.LayoutParams.

If it is working in 22 and not 23, its quite possible that they changed how popups are done in 23. Relying on the parent popup being directly inside of a window was never a safe assumption, your code always had the risk of being broken by an OS update.



来源:https://stackoverflow.com/questions/36093254/android-m-classcastexception-framelayoutlayoutparams-cannot-be-cast-to-windowm

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!