ImageView.getWidth () devuelve 0

Consigo el ancho de imageView 0. A continuación se muestra el código.

Archivo xml:

<ImageView android:id="@+id/img" android:layout_width="200dp" android:layout_height="200dp" /> 

Actividad :

 @Override protected void onResume() { super.onResume(); ImageView img = (ImageView) findViewById(R.id.img); Log.d(TAG, "width : " + img.getWidth()); } 

No quiero usar código debajo como necesito colocar este código en tantos lugares.

 ViewTreeObserver vto = img.getViewTreeObserver(); vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { public boolean onPreDraw() { ImageView img = (ImageView) findViewById(R.id.img); Log.d(TAG, "width : " + img.getWidth()); return true; } }); 

Mi solución: En realidad, más tarde no es necesario agregar este código en una actividad. Lo agregué a una clase que no es de actividad y en vez del ancho de ImageView usé el ancho de la imagen de mapa de bits y ahora no tiene este problema.

¿Dónde llamas getWidth() y getHeight() en ImageView? Si llama desde onCreate() en actividad, no funcionará. getWidth() and getHeight() esperar a que se adjunte la ventana de actividad y, a continuación, llamar a getWidth() and getHeight() en ImageView. Puede intentar llamar a getWidth() and getHeight() del método onWindowFocusChanged() de su actividad.

Invocar onWindowFocusChanged de esta manera

 public void onWindowFocusChanged(boolean hasFocus) { // TODO Auto-generated method stub super.onWindowFocusChanged(hasFocus); if (hasFocus) { ImageView img = (ImageView) findViewById(R.id.img); Log.d(TAG, "width : " + img.getWidth()); } } 

Ya que ya tienes una "fija" de ancho imageView de 200dp por qué no lo acaba de poner en dimens.xml

 <dimen name="image_width">200dp</dimen> 

Y luego simplemente

 int width = (int) getResources().getDimension(R.dimen.image_Width) 

Así que he encontrado muchas muchas preguntas relacionadas que son duplicados a esta pregunta, y la mayoría de las respuestas no eran aptas para mi caso.

He venido con una solución que puede caber para el suyo como lo hace para mí. Simplemente, he creado un ImageView personalizado y agregado una nueva llamada de retorno OnSizeChangedCallback que se está llamando cada vez que el tamaño de la vista se cambia a valores no cero.

He aquí un ejemplo de código propio:

 public class AvatarImageView extends ImageView{ private OnImageViewSizeChanged sizeCallback = null; public AvatarImageView(Context context) { super(context); } public AvatarImageView(Context context, AttributeSet attrs) { super(context, attrs); } public AvatarImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { if (w == 0 || h == 0) { return; } else{ if(sizeCallback != null) sizeCallback.invoke(this, w, h); } } public void setOnImageViewSizeChanged(OnImageViewSizeChanged _callback){ this.sizeCallback = _callback; if (getWidth() != 0 && getHeight() != 0) { _callback.invoke(this, getWidth(), getHeight()); } } public interface OnImageViewSizeChanged{ public void invoke(ImageView v, int w, int h); } } 

Y usted puede utilizarlo simplemente como sigue:

 final AvatarImageView avatarIcon = (AvatarImageView) findViewById(R.id.avatarImg); avatarIcon.setOnImageViewSizeChanged(new AvatarImageView.OnImageViewSizeChanged() { @Override public void invoke(ImageView v, final int w, final int h) { // Do whatever you want with w and h which are non zero values ... } }); 

preguntas relacionadas:

  1. Views-getwidth-and-getheight-returns-0
  2. Android-imageview-return-getwidth-getheight-zero
  3. Android-get-width-returns-0
  • Transferencia de datos enormes del servlet a la aplicación Android
  • ¿Guardando grandes cantidades de datos cuando onPause se llama?
  • GetAvailableBlocksLong () * getBlockSizeLong () VS getAvailableBytes ()
  • Cómo comparar el tiempo en java / android (dado entrada en cadenas)?
  • No se puede resolver el símbolo de Android - Android app - intelliJ
  • ¿Cómo pasar Object ArrayList a través de la interfaz?
  • Androide. Cambio de brillo
  • Path () - segmentos de color inteligentes
  • No se puede construir el proyecto de biblioteca Bintray Gradle - ClassNotFoundException
  • ¿Por qué no desaparece el teclado virtual?
  • Gradle: Cómo excluir javax.realtime paquete de JScience jar dependencia (Multiple dex define)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.