ImageView.getWidth () devuelve 0
Consigo el ancho de imageView 0. A continuación se muestra el código.
Archivo xml:
- Utilizar JRuby para llamar directamente a Android Java Methods
- Cómo ejecutar script matlab desde java (para android) usando matlabcontol.jar
- Android Studio - cómo utilizar bibliotecas (de proyectos eclipse)
- La mejor manera de unir tablas usando sqlite en android
- Usar el diálogo PIN del sistema en la aplicación de Android
<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.
- ¿Es la mejor práctica para almacenar y usar un token OAuth2 en Android?
- Plaza en blanco en Google Maps
- ActiveAndroid Relación de muchos a muchos
- ¿Dex y Dalvik soportan la compatibilidad binaria de Java?
- Error al usar StatusBarManagerService - java.lang.SecurityException en android.permission.STATUS_BAR_SERVICE
- El estado de la batería no se está cargando
- Diseño lib - CoordinatorLayout / CollapsingToolbarLayout con GridView / listView
- Cancelar AsyncTask después de algún tiempo
¿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:
- Views-getwidth-and-getheight-returns-0
- Android-imageview-return-getwidth-getheight-zero
- Android-get-width-returns-0
- Android obtener actividad devuelve null
- ¿Cómo agregar el botón de radio dinámicamente según el número dado de cuentas?