Android: Configurar la altura del botón en XML en función de su ancho

Estoy trabajando en el diseño en android XML en el que me gustaría establecer una altura de los botones para que coincida con su ancho cuando la configuración de llenar padre. Obviamente, este número cambiará en función del tamaño de la pantalla, por lo que no puedo usar un tamaño de píxel establecido. ¿Puede alguien ayudarme con conseguir el ancho del botón basado en el tamaño de la pantalla y después pasar eso a la configuración de la altura?

Gracias, Josh

Una vez tuve un problema similar y no encontré ninguna solución que funciona sólo desde XML. Tienes que escribir tu propio Button-Class y sobrescribir el onMeassure [ onMeassure ] [1].

Ejemplo:

 /** * @see android.view.View#measure(int, int) */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec)); } private int width; // saves the meassured width /** * Determines the width of this view * * @param measureSpec * A measureSpec packed into an int * @return The width of the view, honoring constraints from measureSpec */ private int measureWidth(int measureSpec) { int result = 30; int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); if (specMode == MeasureSpec.EXACTLY) { // We were told how big to be result = specSize; } else { result =1123; // meassure your with here somehow if (specMode == MeasureSpec.AT_MOST) { // Respect AT_MOST value if that was what is called for by measureSpec result = Math.min(result, specSize); } } width = result; return result; } /** * Determines the height of this view * * @param measureSpec * A measureSpec packed into an int * @return The height of the view, honoring constraints from measureSpec */ private int measureHeight(int measureSpec) { int result = 0; int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); if (specMode == MeasureSpec.EXACTLY) { // We were told how big to be result = specSize; } else { result = width; if (specMode == MeasureSpec.AT_MOST) { // Respect AT_MOST value if that was what is called for by measureSpec result = Math.min(result, specSize); } } return result; } 

[1]: http://developer.android.com/reference/android/view/View.html#onMeasure(int , int)

En lugar de utilizar el tamaño de píxeles por PX, mención dip (es decir, píxeles independientes del dispositivo), inmersión tomará el tamaño en píxeles de acuerdo con el tamaño de pantalla del dispositivo de forma independiente.

Por ejemplo: android: textSize = "12dip"

Puede usar dip o dp .

¡¡Disfrutar!!

  • ¿Por qué la gravedad no funciona cuando se aplica al diseño relativo?
  • Los dispositivos compatibles son extremadamente bajos
  • Android Diseño de materiales Navegación Vista -> Elemento
  • Leer ApplicationManifest de Aplicación de Android (apk) usando .NET
  • SOAP - Respuesta XML muy grande - OutOfMemoryError
  • Cómo configurar OnClickListener (Android)
  • Android: popupBackground no funciona para menús contextuales
  • Retrofit y SimpleXML para el elemento raíz desconocido?
  • ¿Cómo puedo obtener de forma confiable un color de un AttributeSet?
  • Ningún recurso encontrado que coincida con el nombre dado en layout_hint
  • Cómo hacer navegación personalizada ver animaciones como ésta
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.