Cómo clasificar una vista de Android según las dimensiones de sus padres

Cómo puedo clasificar una vista según el tamaño de su diseño principal. Por ejemplo, tengo un RelativeLayout que llena la pantalla completa, y quiero una vista de niño, digamos un ImageView , para ocupar toda la altura, y 1/2 de la anchura?

He intentado sobreescribir todo en onMeasure , onLayout , onSizeChanged , etc y no pude conseguir que funcione ….

11 Solutions collect form web for “Cómo clasificar una vista de Android según las dimensiones de sus padres”

No sé si alguien todavía está leyendo este hilo o no, pero la solución de Jeff sólo lo conseguirá a medio camino (un poco literalmente). Lo que su onMeasure hará es mostrar la mitad de la imagen en la mitad de los padres. El problema es que al llamar a super.onMeasure antes de setMeasuredDimension se medirán todos los niños en la vista basándose en el tamaño original y, a continuación, reduzca la vista a la mitad cuando la setMeasuredDimension la setMeasuredDimension tamaño.

En su lugar, debe llamar a setMeasuredDimension (como se requiere para una anulación onMeasure) y proporcionar un nuevo LayoutParams para su vista, y luego llamar a super.onMeasure . Recuerde, sus LayoutParams se derivan del tipo de padre de su vista, no del tipo de su vista.

 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ int parentWidth = MeasureSpec.getSize(widthMeasureSpec); int parentHeight = MeasureSpec.getSize(heightMeasureSpec); this.setMeasuredDimension(parentWidth/2, parentHeight); this.setLayoutParams(new *ParentLayoutType*.LayoutParams(parentWidth/2,parentHeight)); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } 

Creo que la única vez que usted tendrá problemas con el padre LayoutParams es si el padre es un AbsoluteLayout (que es obsoleto, pero a veces útil).

Puede solucionar esto creando una Vista personalizada y anulando el método onMeasure (). Si siempre utilizas "fill_parent" para el layout_width en tu xml entonces el parámetro widthMeasureSpec que se pasa al método onMeasusre () debe contener el ancho del padre.

 public class MyCustomView extends TextView { public MyCustomView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int parentWidth = MeasureSpec.getSize(widthMeasureSpec); int parentHeight = MeasureSpec.getSize(heightMeasureSpec); this.setMeasuredDimension(parentWidth / 2, parentHeight); } } 

Su XML se vería así:

 <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent"> <view class="com.company.MyCustomView" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> 

He encontrado que es mejor no meterse en la configuración de las dimensiones medidas usted mismo. En realidad, hay un poco de negociación entre las vistas padre y hijo y no se desea volver a escribir todo ese código .

Lo que puede hacer, sin embargo, es modificar el measureSpecs, a continuación, llamar a super con ellos. Su opinión nunca sabrá que está recibiendo un mensaje modificado de su padre y se encargará de todo para usted:

 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int parentHeight = MeasureSpec.getSize(heightMeasureSpec); int myWidth = (int) (parentHeight * 0.5); super.onMeasure(MeasureSpec.makeMeasureSpec(myWidth, MeasureSpec.EXACTLY), heightMeasureSpec); } 

Cuando define un diseño y una vista en XML, puede especificar el ancho y la altura del diseño de una vista para que se pueda ajustar el contenido o rellenar el padre. Tomar la mitad de la zona es un poco más difícil, pero si usted tenía algo que quería en la otra mitad que podría hacer algo como lo siguiente.

  <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:layout_height="fill_parent" android:layout_width="0dp" android:layout_weight="1"/> <ImageView android:layout_height="fill_parent" android:layout_width="0dp" android:layout_weight="1"/> </LinearLayout> 

Dar dos cosas con el mismo peso significa que se extienden para tomar la misma proporción de la pantalla. Para más información sobre diseños, vea los documentos de desarrollo.

Creo que Mayras XML-enfoque puede venir en limpio. Sin embargo, es posible hacerlo más preciso, con una sola vista estableciendo el peso. Yo no llamaría a esto un hack más, pero en mi opinión, el enfoque más directo:

 <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:weightSum="1"> <ImageView android:layout_height="fill_parent" android:layout_width="0dp" android:layout_weight="0.5"/> </LinearLayout> 

Así, puedes usar cualquier peso, 0.6 por ejemplo (y centrar) es el peso que me gusta usar para los botones.

Prueba esto

 int parentWidth = ((parentViewType)childView.getParent()).getWidth(); int parentHeight = ((parentViewType)childView.getParent()).getHeight(); 

Entonces puede usar LinearLayout.LayoutParams para establecer los parámetros de chileView

 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(childWidth,childLength); childView.setLayoutParams(params); 

Ahora puede usar PercentRelativeLayout. ¡Auge! Problema resuelto.

Romano, si desea hacer su diseño en código Java (ViewGroup descendiente), es posible. El truco es que tienes que implementar los métodos onMeasure y onLayout. El onMeasure se llama primero y usted necesita "medir" la subvista (efectivamente dimensionar el valor deseado) allí. Necesita volver a clasificarlo en la llamada onLayout. Si no realiza esta secuencia o no llama a setMeasuredDimension () al final de su código onMeasure, no obtendrá resultados. ¿Por qué está diseñado de manera tan complicada y frágil está más allá de mí.

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), a continuación, establecer los anchos de ambas vistas a fill_parent y ambos pesos a 1.

Esto funciona en un LinearLayout …

Es algo como esto:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.company.myapp.ActivityOrFragment" android:id="@+id/activity_or_fragment"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/linearLayoutFirst" android:weightSum="100"> <!-- Overall weights sum of children elements --> <Spinner android:layout_width="0dp" <!-- It's 0dp because is determined by android:layout_weight --> android:layout_weight="50" android:layout_height="wrap_content" android:id="@+id/spinner" /> </LinearLayout> <LinearLayout android:layout_height="wrap_content" android:layout_width="match_parent" android:layout_below="@+id/linearLayoutFirst" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:id="@+id/linearLayoutSecond"> <EditText android:layout_height="wrap_content" android:layout_width="0dp" android:layout_weight="75" android:inputType="numberDecimal" android:id="@+id/input" /> <TextView android:layout_height="wrap_content" android:layout_width="0dp" android:layout_weight="25" android:id="@+id/result"/> </LinearLayout> </RelativeLayout> 

Tengo otra solución. Podemos obtener el ancho y la altura de los padres, entonces sólo se utiliza para calcular el tamaño y asignar a los params de diseño.
Me gusta esto:

 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // Don't for get this int parentWidth = ((View) getParent()).getMeasuredWidth(); int parentHeight = ((View) getParent()).getMeasuredHeight(); if (parentWidth*parentHeight != 0) { // Check if both width and height in non-zero LayoutParams lp = getLayoutParams(); lp.width = parentWidth / 2; lp.height = parentHeight; } } 
  • Cómo obtener N texto que se puede caber en la pantalla / TextView con un tamaño específico?
  • Divisores entre TabWidgets
  • Diálogo de Android: Eliminación de la barra de título
  • Botón Onclick Listener en los diseños incluidos
  • Stackoverflow: ¿Causado por vistas anidadas?
  • Intervalo de números seguro para mi propio ID en diseño dinámico?
  • ¿Cómo crear botones estándar sin bordes (como en la línea de diseño mencionada)?
  • ¿Cómo alinear el texto a la parte superior de TextView?
  • Cómo establecer la propiedad "android: drawableTop" de un botón en tiempo de ejecución
  • Escala de la imagen de fondo en LinearLayout
  • Comparación de diseños de diseño de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.