Android M ClassCastException: FrameLayout $ LayoutParams no se puede convertir en WindowManager $ LayoutParams

Este pedazo de trabajo del código parece trabajar en el api del androide 16 – 22 pero no trabaja en el api 23. Estoy intentando simplemente exhibir un popupwindow con opciones en él y dim el fondo debajo del 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); 

Ejecutar este código produce un 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) 

¿Qué ha ido mal?

Por lo que sé, WindowManager.LayoutParams extiende ViewGroup.LayoutParams y cuando llamo a parent.getLayoutParams() , devuelve un ViewGroup.LayoutParams por lo que no debe ser un classCastException .

Sólo tiene que añadir uno más .getParent () para acceder al contenedor.

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

Hay una excepción de conversión de clase. Estás lanzando un ViewGroup.LayoutParams a un WindowManager.LayoutParams . Si el objeto real devuelto es una instancia de un hijo diferente de ViewGroup.LayoutParams (por ejemplo, FrameLayout.LayoutParams ), entonces el molde es ilegal. En este caso, la vista llamada parent no está directamente en una ventana, dentro de FrameLayout . Así que llamar a getLayoutParams devuelve un FrameLayout.LayoutParams , no un WindowsManager.LayoutParams .

Si está trabajando en 22 y no en 23, es muy posible que hayan cambiado cómo se hacen las ventanas emergentes en 23. Confiar en que el popup de los padres esté directamente dentro de una ventana nunca fue un supuesto seguro, su código siempre tuvo el riesgo de ser roto por una actualización del sistema operativo.

  • Descartar la ventana emergente por el botón Atrás
  • ¿Cómo hacer una simple ventana emergente de Android?
  • PopupWindow no responde a los eventos de arrastrar y colocar
  • ¿Cómo puedo reemplazar mi código popupmenu con la lista popupwindow?
  • EditText setError no funciona en PopupWindow
  • Android Listview en PopupWindow onitemclick no funciona en algún dispositivo
  • Cómo hacer animación para la ventana emergente en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.