Android: ¿por qué no hay maxHeight para una vista?

Las vistas tienen un minHeight pero de alguna manera carecen de un maxHeight :

Lo que estoy tratando de lograr es tener algunos elementos (vistas) llenando un 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 que el ScrollView deje de expandir (por lo tanto, un maxHeight ) y empezar a proporcionar desplazamiento.

Sin embargo, lamentablemente no hay forma de establecer un maxHeight . Así que probablemente tengo que configurar mi altura de ScrollView programática a WRAP_CONTENT cuando hay 1..3 elementos y establecer la altura a 3*sizeOf(View) cuando hay 4 o más elementos.

¿Puede alguien explicar por qué no hay maxHeight siempre, cuando ya hay un minHeight ?

(BTW: algunas vistas, como ImageView tienen un maxHeight implementado.)

11 Solutions collect form web for “Android: ¿por qué no hay maxHeight para una vista?”

Ninguna de estas soluciones funcionó para lo que necesitaba, que era un ScrollView configurado para wrap_content pero con un maxHeight por lo que dejaría de expandirse después de un cierto punto y empezar a desplazarse. Simplemente sobrescribí el método onMeasure en ScrollView.

 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { heightMeasureSpec = MeasureSpec.makeMeasureSpec(300, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } 

Esto puede no funcionar en todas las situaciones, pero sin duda me da los resultados necesarios para mi diseño. Y también aborda el comentario de madhu.

Si algún diseño presente debajo del scrollview entonces este truco no funcionará – Madhu Mar 5 at 4:36

Con el fin de crear un ScrollView o ListView con un maxHeight sólo tiene que crear un LinearLayout transparente alrededor de él con una altura de lo que desea que el maxHeight a ser. A continuación, establezca la Altura de ScrollView en wrap_content . Esto crea un ScrollView que parece crecer hasta que su altura sea igual al LinearLayout principal.

Esto funcionó para mí para que sea personalizable en xml:

MaxHeightScrollView.java:

 public class MaxHeightScrollView extends ScrollView { private int maxHeight; private final int defaultHeight = 200; public MaxHeightScrollView(Context context) { super(context); } public MaxHeightScrollView(Context context, AttributeSet attrs) { super(context, attrs); if (!isInEditMode()) { init(context, attrs); } } public MaxHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); if (!isInEditMode()) { init(context, attrs); } } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public MaxHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); if (!isInEditMode()) { init(context, attrs); } } private void init(Context context, AttributeSet attrs) { if (attrs != null) { TypedArray styledAttrs = context.obtainStyledAttributes(attrs, R.styleable.MaxHeightScrollView); //200 is a defualt value maxHeight = styledAttrs.getDimensionPixelSize(R.styleable.MaxHeightScrollView_maxHeight, defaultHeight); styledAttrs.recycle(); } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } 

Attr.xml

 <declare-styleable name="MaxHeightScrollView"> <attr name="maxHeight" format="dimension" /> </declare-styleable> 

Ejemplo de diseño

 <blah.blah.MaxHeightScrollView android:layout_weight="1" app:maxHeight="90dp" android:layout_width="fill_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/commentField" android:hint="Say Something" android:background="#FFFFFF" android:paddingLeft="8dp" android:paddingRight="8dp" android:gravity="center_vertical" android:maxLines="500" android:minHeight="36dp" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </blah.blah.MaxHeightScrollView> 

Hubiera comentado la respuesta de whizzle si pudiera, pero pensé que era útil notar que para resolver este problema en el contexto del modo multi-ventana en Android N, necesitaba cambiar el código ligeramente a esto:

 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if(MeasureSpec.getSize(heightMeasureSpec) > maxHeight) { heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } 

Esto permite que el diseño cambie de tamaño para ser más pequeño que la altura máxima, pero también evitar que sea mayor que la altura máxima. He utilizado esto es una clase de diseño que Anula RelativeLayout y esto me permitió crear un cuadro de diálogo personalizado con un ScrollView como el hijo de MaxHeightRelativeLayout que no se expande la altura completa de la pantalla y también se encoge para encajar en el tamaño de la viuda más pequeña en multi- Ventana para Android N.

No hay forma de establecer maxHeight. Pero puede configurar la altura.

Para hacer esto necesitarás descubrir la altura de cada elemento de tu scrollView. Después de que acaba de configurar su altura scrollView a numberOfItens * heightOfItem.

Para descubrir la altura de un elemento, haga lo siguiente:

 View item = adapter.getView(0, null, scrollView); item.measure(0, 0); int heightOfItem = item.getMeasuredHeight(); 

Para establecer la altura haga eso:

 // if the scrollView already has a layoutParams: scrollView.getLayoutParams().height = heightOfItem * numberOfItens; // or // if the layoutParams is null, then create a new one. scrollView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, heightOfItem * numberOfItens)); 

Como sabemos que los dispositivos que ejecutan Android pueden tener diferentes tamaños de pantalla. Como sabemos más adelante las opiniones deben ajustar dinámicamente y convertirse en el espacio que es apropiado.

Si establece una altura máxima, tal vez obligue a la vista a no obtener suficiente espacio ni a ocupar menos espacio. Sé que a veces parece que es prácticamente para establecer una altura máxima. Pero si la resolución va a cambiar dramáticamente, y lo hará !, entonces la vista, que tiene una altura máxima, se verá inadecuado.

Creo que no hay manera correcta de hacer exactamente el diseño que desea. Te recomiendo que pienses en tu diseño usando gestores de diseño y mecanismos relativos. No sé lo que estás tratando de lograr, pero suena un poco extraño para mí que una lista sólo debe mostrar tres elementos y, a continuación, el usuario tiene que desplazarse.

Por cierto MinHeight no está garantizado (y tal vez tampoco debería existir). Puede tener algún beneficio para obligar a los elementos a ser visible, mientras que otros elementos relativos se hacen más pequeños.

Si alguien está considerando usar el valor exacto para LayoutParams, por ejemplo

 setLayoutParams(new LayoutParams(Y, X ); 

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:

 Display display = getWindowManager().getDefaultDisplay(); DisplayMetrics d = new DisplayMetrics(); display.getMetrics(d); setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, (int)(50*d.density) )); 

¿Ha 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ías varias vistas que debían ser estiradas, entonces el valor se convertiría en un peso entre ellas.

Así que si tuviera dos vistas ambas configuradas con un valor de layout_weight de 1, entonces ambos tendrían que rellenar el espacio, pero ambas se extenderían a una cantidad igual de espacio. Si usted fija uno de ellos al valor de 2, entonces estiraría el doble que la otra vista.

Un poco más de información aquí se enumeran en Linear Layout.

I think u puede establecer el heiht en tiempo de ejecución de 1 elemento sólo scrollView.setHeight(200px) , para 2 elementos scrollView.setheight(400px) para 3 o más scrollView.setHeight(600px)

Primero obtenga la altura del elemento en píxeles

 View rowItem = adapter.getView(0, null, scrollView); rowItem.measure(0, 0); int heightOfItem = rowItem.getMeasuredHeight(); 

Entonces simplemente

 Display display = getWindowManager().getDefaultDisplay(); DisplayMetrics displayMetrics = new DisplayMetrics(); display.getMetrics(displayMetrics); scrollView.getLayoutParams().height = (int)((heightOfItem * 3)*displayMetrics .density); 

Si ustedes quieren hacer un scrollview o listview sin desbordamiento, sólo pero en un RelativeLayout con un topview y bottomview en la parte superior e inferior para ello:

 <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@+id/topview" android:layout_below="@+id/bottomview" > 
  • Android: detener la reducción de la imagen
  • Vista androide o surfaceView, ¿qué debo usar?
  • ¿Qué tipo de conexión existe entre innerRadiusRatio y thicknessRatio de la clase GradientDrawable?
  • Colocación / superposición (índice-z) una vista encima de las pestañas de la barra de acciones
  • Android - ¿Cómo circular zoom / ampliar parte de la imagen?
  • Vista previa de la cámara Android estirada
  • La vista previa de la cámara muestra mosaicos no deseados sólo en Android 4.2.2 (S4, pantalla Full HD)
  • Invisible SurfaceView para previsualización de la cámara
  • Lista de posición de los puntos repetidos en getview
  • ¿Cómo se anima un cambio en el relleno de una vista?
  • Evite onMeasure y onLayout cada vez que ImageView Bitmap se establece
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.