¿Cómo se calcula el tamaño de un widget Android después de la distribución?

Tengo un diseño que especifica los tamaños de los widgets en la dimensión relativa, por ejemplo:

<LinearLayout ... layout_height="fill_parent"> <ImageView ... layout_height="wrap_content" /> <TextView ... layout_height="120dp" /> </LinearLayout> 

Inmediatamente después de onCreate , quiero saber cuánto es la altura del ImageView. ¿Como hacer eso?

Nota: Si llamo a getHeight() en onCreate , obtengo 0.

También he intentado imageView.postDelayed , trabaja en el emulador 2.1 pero falla en el emulador 1.5 (conseguí 0, también).

Por último, traté de crear un Handler , y luego llamo handler.postDelayed con 10 ms de retraso. Funciona tanto en emulador 2.1 como en 1.5, pero falló al iniciar el programa en depurador eclipse (Por lo tanto, concluyo que el uso del retardo no garantiza que la obtención de la altura ocurra después de que la vista de la imagen esté configurada).

La razón por la que obtiene un tamaño de 0 es que el diseño no está terminado hasta después de que la actividad esté completamente creada, es decir, onCreate (), onStart () y onResume (). La manera más fácil que conozco para obtener el tamaño exacto es llamar a su método después de que el diseño haya terminado, por ejemplo, utilizando un oyente de clics en un botón. Dado que el botón no se muestra hasta que se termina el diseño, el tamaño debe estar disponible en el momento en que se activa su escucha de clics.

Esto es sólo una suposición, pero me imagino que esto es difícil de hacer precisamente porque no quieren que la gente se ensucie con los tamaños de diseño una vez que el sistema acaba de terminar de estirar la pantalla. Si proporcionaron un "onLayoutFinished ()" devolución de llamada, entonces usted podría conseguir usted mismo pegado en un bucle si usted modificó el diseño en eso. Por ejemplo, imagine: el diseño se ha completado; OnLayoutFinished () lo llamó y modificó el diseño allí; El diseño existente ya no es válido; Diseño hecho de nuevo; OnLayoutFinished () llamó de nuevo; Su código se llama de nuevo – y así sucesivamente.

Otra forma de hacerlo es crear una Vista personalizada y anular el onMeasure(int, int) . El sistema activa ese método para obtener el tamaño de cada vista; Si usas algo como mi ejemplo a continuación, puedes obtener el tamaño sugerido antes de que el diseño esté terminado:

 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ super.onMeasure(widthMeasureSpec, heightMeasureSpec); //getMeasuredHeight() and getMeasuredWidth() now contain the suggested size } 

(Yo escribí que es el tamaño sugerido porque creo que es posible que el tamaño se cambie después de esto basado en las restricciones de diseño Sin embargo, es un vago recuerdo de algo que leí hace un tiempo, y nunca he experimentado en detalle.) Una vez que usted Has hecho eso, puedes usar el tamaño para lo que sea que quisieras hacer. Incluso puedes cambiar el tamaño que usará usando setMeasuredDimension(newX, newY) .

El objeto View proporciona un método llamado onSizeChanged (int w, int h, int oldw, int oldh). Se llama cuando el diseño cambia el tamaño de uno de sus componentes. Si anula este método, entonces el código de su versión de este método conocerá el tamaño de sí mismo como se muestra en el siguiente fragmento.

 @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { bounds = new Rect(); this.getDrawingRect(bounds); // bounds will now contain none zero values } 
  • Cambiar margen de un diseño mediante XML en la lista de capas
  • ¿Cómo crear un efecto de marquesina para un texto de menor longitud que no exceda el tamaño de la pantalla en Android?
  • Android: alineación del texto giratorio a la derecha pero no centrada
  • Android onLayout () y AsyncTask () no funcionan juntos
  • ¿Cómo evitar la vista superpuesta en el diseño relativo en android?
  • Habilitar desplazamiento dentro de EditText que está en ScrollView
  • AppBarLayout con elevación = 0dp no responde a los eventos táctiles (haga clic)
  • El banner de adMob cubre la vista de texto cuando aparece el teclado virtual
  • Animación de botón de acción flotante de Android
  • Cómo deshabilitar el desplazamiento de NestedScrollView & CollapsingToolbarLayout, por ejemplo, cuando no hay más contenido a continuación?
  • Recylerview no visible dentro de scrollview o nestedScrollview
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.