2011-01-08 15 views
14

Estoy inflando un RelativeLayout de XML y luego intento establecer programáticamente sus parámetros de diseño y recibo una ClassCastException.Establecer params de diseño RelativeLayout mediante programación - throw ClassCastException

Código:

profileHeader = (RelativeLayout)mInflater.inflate(R.layout.user_profile_header, null); 
profileHeader.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.FILL_PARENT)); 

tiros

E/AndroidRuntime(2963): java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams 
E/AndroidRuntime(2963): at android.widget.ListView.measureScrapChild(ListView.java:1119) 
E/AndroidRuntime(2963): at android.widget.ListView.measureHeightOfChildren(ListView.java:1202) 
E/AndroidRuntime(2963): at android.widget.ListView.onMeasure(ListView.java:1111) 
E/AndroidRuntime(2963): at android.view.View.measure(View.java:8222) 
E/AndroidRuntime(2963): at android.view.ViewGroup.measureChildWithMargins(V 

que he visto otras notas en la red para intentar usar LinearLayout.LayoutParams pero eso no parece ayudar.

Si se está preguntando por qué estoy haciendo esto y no solo configurándolo en el XML, es porque estoy viendo algo raro donde el diseño "salta" a una envoltura/envoltura. YO ESTOY configurándolo en fill_parent/fill_parent en el XML y al desplazar la vista "encoge" a lo que parece ser wrap/wrap. Es realmente extraño. En cuanto al código fuente de Android foursquared, encontré un comentario donde el desarrollador dice lo mismo:

"Algo extraño está pasando con los parámetros de diseño. Si no establecemos explícitamente el diseño para llenar/llenar después inflar, el diseño salta a un diseño de envoltura/envoltura ". (FriendsActivity.java:258)

Lo cual suena como mi problema, por lo tanto, estoy tratando de hacer lo mismo (configurar el diseño mediante código), pero en su caso usa LinearLayout, mientras que yo estoy usando RelativeLayout.

¿Qué me estoy perdiendo? Gracias por adelantado.

Respuesta

69

Los parámetros de diseño deben ser del tipo del elemento primario. Por lo tanto, si está creando un RelativeLayout y lo está agregando a un ListView, los parámetros de diseño deben ser de tipo ListView.LayoutParams, no RelativeLayout.LayoutParams. La forma correcta de hacerlo es llamar inflar de esta manera:

inflar (R.layout.mylayout, theListView, false);

Esta versión de inflate() inflará correctamente los parámetros de diseño (android: layout_ *) definidos en XML.

+0

Gracias Romain, esto hace responder a la pregunta y me permite establecer el RelativeLayout params mediante programación. Desafortunadamente, esperaba que resolviera mi problema de evitar que la vista "saltara" a un enrollamiento/enrollamiento en el desplazamiento (visiblemente se encoge en el desplazamiento, luego vuelve a la normalidad en el lanzamiento). Pero no resolvió ese problema. Muy extraño. –

+0

No puedo ayudarte en este segundo problema sin más información sobre el código. De hecho, es muy extraño :) –

Cuestiones relacionadas