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:
- ¿Hay un ejemplo simple de la clase PopupWindow que utiliza Android v2.0?
- Android PopupWindow: Fondo blanco, pero mantener la sombra?
- Cambiar el fondo popupMenu en Android
- PopupWindow - no funciona en algunos dispositivos
- Cómo conseguir un diálogo personalizado en la parte inferior de la pantalla en android
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
.
- Error en Spinner en una ventana emergente, se bloquea cuando se hace clic
- ¿Debo usar un PopupWindow o DialogFragment para aceptar la entrada?
- Cómo crear una ventana emergente en android?
- El fondo de PopupWindow a veces se vuelve transparente y morado
- Android - utilizar spinner omisión sombra predeterminada
- Desenfoque o fondo oscuro cuando Android PopupWindow está activo
- ¿Cómo mostrar correctamente un menú emergente debajo de un TextView, similar a Spinner?
- Menú personalizado de PopUp
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.