¿Cómo puedo cambiar el tamaño de una vista en función del tamaño de su diseño principal? Por ejemplo, tengo una RelativeLayout
que ocupa toda la pantalla y quiero una vista infantil, digamosImageView
, ocupe toda la altura y la mitad del ancho.
He intentado anular en todo onMeasure
, onLayout
, onSizeChanged
, etc, y no pude conseguir que funcione ....
Respuestas:
No sé si alguien todavía está leyendo este hilo o no, pero la solución de Jeff solo te llevará a la mitad (un poco literalmente). Lo que hará su onMeasure es mostrar la mitad de la imagen en la mitad del padre. El problema es que llamar a super.onMeasure antes de
setMeasuredDimension
que medirá todos los elementos secundarios de la vista en función del tamaño original, luego simplemente cortará la vista por la mitad cuando elsetMeasuredDimension
cambie tamaño.En su lugar, debe llamar
setMeasuredDimension
(según sea necesario para una anulación de onMeasure) y proporcionar una nuevaLayoutParams
para su vista, luego llamarsuper.onMeasure
. Recuerde,LayoutParams
se derivan del tipo principal de su vista, no del tipo de su vista.Creo que la única vez que tendrá problemas con el padre
LayoutParams
es si el padre es unAbsoluteLayout
(lo cual está desaprobado pero a veces es útil).fuente
MeasureSpec.getSize(widthMeasureSpec)
Realmente da el ancho correcto del padre? Para mí, solo devuelve anchos aleatorios que están bastante cerca del ancho real, pero no exactos.wrap_content
lo que no funcionará. La respuesta de Vic no funciona para este escenario, pero el comentario de @ M.Schenk sí. También ahorra una pasada de diseño adicional. También debe publicarlo como una respuesta para la visibilidad.super.onMeasure()
simplemente anulará y anulará los efectos de la llamada anterior athis.setMeasuredDimension()
?super.onMeasure()
no anula los cálculos anteriores.Puede resolver esto creando una Vista personalizada y anulando el método onMeasure (). Si siempre usa "fill_parent" para layout_width en su xml, entonces el parámetro widthMeasureSpec que se pasa al método onMeasusre () debe contener el ancho del padre.
Su XML se vería así:
fuente
Descubrí que es mejor no perder el tiempo configurando las dimensiones medidas usted mismo. En realidad, hay un poco de negociación entre las opiniones de los padres y los hijos y no desea volver a escribir todo ese código .
Sin embargo, lo que puede hacer es modificar las MeasureSpecs y luego llamar a super con ellas. Su vista nunca sabrá que está recibiendo un mensaje modificado de su padre y se encargará de todo por usted:
fuente
Cuando define un diseño y una vista en XML, puede especificar el ancho y el alto del diseño de una vista para que sea contenido envolvente o primario. Ocupar la mitad del área es un poco más difícil, pero si tuviera algo que quisiera en la otra mitad, podría hacer algo como lo siguiente.
Dar el mismo peso a dos cosas significa que se estirarán para ocupar la misma proporción de la pantalla. Para obtener más información sobre diseños, consulte los documentos de desarrollo.
fuente
Creo que el enfoque XML de Mayras puede venir bien. Sin embargo, es posible hacerlo más preciso, con una sola vista configurando el valor weightSum. Ya no llamaría a esto un truco, pero en mi opinión, el enfoque más sencillo:
De esta manera, puede usar cualquier peso, 0.6 por ejemplo (y centrado) es el peso que me gusta usar para los botones.
fuente
Prueba esto
entonces puede usar LinearLayout.LayoutParams para configurar los parámetros de chileView
fuente
Ahora puede usar PercentRelativeLayout. ¡Auge! Problema resuelto.
fuente
Roman, si desea hacer su diseño en código Java (descendiente de ViewGroup), es posible. El truco es que debe implementar los métodos onMeasure y onLayout. El onMeasure se llama primero y necesita "medir" la subvista (dimensionándola efectivamente al valor deseado) allí. Necesita cambiar su tamaño nuevamente en la llamada onLayout. Si no logra hacer esta secuencia o no llama a setMeasuredDimension () al final de su código onMeasure, no obtendrá resultados. Por qué está diseñado de una manera tan complicada y frágil se me escapa.
fuente
Si el otro lado está vacío. Supongo que la forma más sencilla sería agregar una vista vacía (por ejemplo, un diseño lineal) y luego establecer los anchos de ambas vistas en fill_parent y ambos pesos en 1.
Esto funciona en un LinearLayout ...
fuente
Es algo como esto:
fuente
He estado luchando con esta pregunta durante mucho tiempo, quiero cambiar el ancho del cajón de mi DrawerLayout, que es el segundo hijo de su padre. Recientemente lo descubrí, pero no sé si hay una idea mejor.
fuente