Las vistas tienen unminHeight
pero de alguna manera carecen de maxHeight
:
Lo que estoy tratando de lograr es tener algunos elementos (vistas) llenando a ScrollView
. Cuando hay 1..3 elementos, quiero mostrarlos directamente. Lo que significa que ScrollView
tiene la altura de 1, 2 o 3 elementos.
Cuando hay 4 o más elementos, quiero ScrollView
que deje de expandirse (por lo tanto, a maxHeight
) y comience a proporcionar desplazamiento.
Sin embargo, desafortunadamente no hay forma de establecer un maxHeight
. Por lo tanto, es probable que tenga que establecer mi ScrollView
altura mediante programación WRAP_CONTENT
cuando hay 1..3 elementos y establecer la altura 3*sizeOf(View)
cuando hay 4 o más elementos.
¿Alguien puede explicar por qué no se maxHeight
proporciona, cuando ya existe minHeight
?
(Por cierto: algunas vistas, como ImageView
tener un maxHeight
implementado).
Respuestas:
Ninguna de estas soluciones funcionó para lo que necesitaba, que era un ScrollView configurado para wrap_content pero que tenía un maxHeight para que dejara de expandirse después de cierto punto y comenzara a desplazarse. Simplemente anulé el método onMeasure en ScrollView.
Es posible que esto no funcione en todas las situaciones, pero ciertamente me da los resultados necesarios para mi diseño. Y también aborda el comentario de madhu.
fuente
Para crear un
ScrollView
oListView
con maxHeight solo necesita crear un diseño lineal transparente alrededor de él con una altura de lo que desea que sea maxHeight. Luego establece la Altura del ScrollView enwrap_content
. Esto crea un ScrollView que parece crecer hasta que su altura es igual a la LinearLayout principal.fuente
Esto funcionó para mí para hacerlo personalizable en xml:
MaxHeightScrollView.java:
attr.xml
diseño de ejemplo
fuente
(Sé que esto no responde directamente a la pregunta, pero podría ser útil para otras personas que buscan la funcionalidad maxHeight)
ConstraintLayout ofrece altura máxima para sus hijos a través de
o
Muestra de uso aquí .
fuente
Hubiera comentado la respuesta de whizzle si pudiera, pero me pareció útil tener en cuenta que para poder resolver este problema en el contexto del modo de ventanas múltiples en Android N, necesitaba cambiar el código ligeramente a esto:
Esto permite que el tamaño del diseño sea más pequeño que la altura máxima, pero también evita que sea más grande que la altura máxima. Utilicé esta es una clase de diseño que anula
RelativeLayout
y esto me permitió crear un cuadro de diálogo personalizado con un elementoScrollView
secundarioMaxHeightRelativeLayout
que no expande la altura completa de la pantalla y también se reduce para ajustarse al tamaño de viuda más pequeño en múltiples ventanas para Android NORTE.fuente
No hay forma de establecer maxHeight. Pero puedes establecer la Altura.
Para hacerlo, deberá descubrir la altura de cada elemento de su scrollView. Después de eso, simplemente configure la altura de scrollView en numberOfItens * heightOfItem.
Para descubrir la altura de un artículo haz eso:
Para establecer la altura, haga eso:
fuente
Envuelva su
ScrollView
alrededor de un planoLinearLayout
con layout_height = "max_height", esto hará un trabajo perfecto. De hecho, tengo este código en producción de los últimos 5 años con cero problemas.fuente
Mi
MaxHeightScrollView
vista personalizadastyle.xml
Utilizando
fuente
Tengo una respuesta aquí:
https://stackoverflow.com/a/29178364/1148784
Simplemente cree una nueva clase que extienda ScrollView y anule su
onMeasure
método.fuente
Como se mencionó anteriormente, ConstraintLayout ofrece la altura máxima para sus hijos a través de:
Además, si la altura máxima para un niño de ConstraintLayout es incierta hasta que se ejecute la aplicación, todavía hay una manera de hacer que este niño adapte automáticamente una altura mutable sin importar dónde se colocó en la cadena vertical.
Por ejemplo, necesitamos mostrar un diálogo inferior con un encabezado mutable TextView, un ScrollView mutable y un pie de página mutable TextView. La altura máxima del diálogo es 320dp, cuando la altura total no alcanza 320dp ScrollView actúa como wrap_content, cuando la altura total excede ScrollView actúa como "maxHeight = 320dp - altura del encabezado - altura del pie de página".
Podemos lograr esto solo a través del archivo de diseño xml:
La mayoría del código de importación es corto:
El uso de maxWidth horizontal es bastante similar.
fuente
¿Has intentado usar el valor de layout_weight ? Si establece uno en un valor mayor que 0, extenderá esa vista al espacio restante disponible.
Si tenía varias vistas que debían ampliarse, el valor se convertirá en un peso entre ellas.
Entonces, si tuviera dos vistas establecidas en un valor de layout_weight de 1, ambas se estirarían para llenar el espacio, pero ambas se estirarían en la misma cantidad de espacio. Si establece uno de ellos en el valor de 2, entonces se estiraría el doble que la otra vista.
Aquí encontrará más información en Diseño lineal.
fuente
maxHeight
que pueda establecer en un valor de inmersión específico. (Finalmente terminé para calcular y establecer las alturas mediante programación)Creo que puede configurar la altura en tiempo de ejecución para 1 elemento solo
scrollView.setHeight(200px)
, para 2 elementosscrollView.setheight(400px)
para 3 o másscrollView.setHeight(600px)
fuente
Como sabemos, los dispositivos con Android pueden tener diferentes tamaños de pantalla. Como sabemos, las vistas deben ajustarse dinámicamente y convertirse en el espacio apropiado.
Si establece una altura máxima, puede forzar la vista a no tener suficiente espacio o ocupar menos espacio. Sé que a veces parece ser prácticamente establecer una altura máxima. Pero si la resolución cambia drásticamente, ¡y lo hará!, Entonces la vista, que tiene una altura máxima, no se verá adecuada.
Creo que no hay una forma adecuada de hacer exactamente el diseño que desea. Le recomendaría que reflexione sobre su diseño utilizando administradores de diseño y mecanismos relativos. No sé qué estás tratando de lograr, pero me parece un poco extraño que una lista solo muestre tres elementos y luego el usuario tenga que desplazarse.
por cierto. minHeight no está garantizado (y quizás tampoco debería existir). puede tener algún beneficio forzar que los elementos sean visibles mientras que otros elementos relativos se hacen más pequeños.
fuente
Si alguien está considerando usar el valor exacto para LayoutParams, por ejemplo
Recuerde tener en cuenta la densidad de la pantalla del dispositivo; de lo contrario, podría obtener un comportamiento muy extraño en diferentes dispositivos. P.ej:
fuente
Primero obtenga la altura del elemento en píxeles
entonces simplemente
fuente
si quieren hacer una vista de desplazamiento o lista de desbordamiento, pero solo en un RelativeLayout con una vista superior y una vista inferior en la parte superior e inferior para ello:
fuente
Usé un ScrollView personalizado hecho en Kotlin que usa
maxHeight
. Ejemplo de uso:Aquí está el código de
ScrollViewWidthMaxHeight
:que necesita también esta declaración en
values/attrs.xml
:fuente