ImageView.getWidth () renvoie 0

Je reçois la largeur d'imageView. Voici un code.

Fichier xml:

  • Tirage de navigation de style de conception de matériel Android 5.0 pour KitKat
  • Portant la classe Java et les méthodes pour Android. (TextLayout, Font, Graphics2D, etc.)
  • Animation avant l'API 11
  • Quelles polices sont disponibles sur Android?
  • Android peut-il supporter Zeroconf / Bonjour sur Bluetooth? Que diriez-vous de TCP / IP?
  • Caméra Android verrouillée après la fermeture de la force
  • <ImageView android:id="@+id/img" android:layout_width="200dp" android:layout_height="200dp" /> 

    Activité:

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

    Je ne veux pas utiliser le code ci-dessous car j'ai besoin de placer ce code dans de nombreux endroits.

     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; } }); 

    Ma solution de contournement: en fait, plus tard, je n'ai pas besoin d'ajouter ce code dans une activité. Je l'ai ajouté à une classe hors activité et, au lieu de la largeur d'ImageView, j'ai utilisé la largeur de l'image Bitmap et je n'ai plus ce problème.

  • Android Webview: détecte quand le rendu est terminé
  • Comment récupérer des parties du contenu Wikipedia dans une application Android?
  • RelativeLayout ne modifie pas correctement la largeur de la vue personnalisée
  • SurfaceCréé () Jamais appelé
  • Android: comment actualiser le contenu ListView?
  • Comment utiliser getlinecount () dans la visualisation de texte android
  • 3 Solutions collect form web for “ImageView.getWidth () renvoie 0”

    Où vous appelez getWidth() et getHeight() sur ImageView? Si vous appelez depuis onCreate() en activité, cela ne fonctionnera pas. Vous devez attendre que la fenêtre d'activité soit jointe, puis appeler getWidth() and getHeight() sur ImageView. Vous pouvez essayer d'appeler getWidth() and getHeight() partir de la méthode onWindowFocusChanged() de votre activité.

    Appeler onWindowFocusChanged comme ça

     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()); } } 

    Puisque vous avez déjà une image "fixed" widthView de 200dp pourquoi ne pas simplement le mettre dans dimens.xml

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

    Et ensuite simplement

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

    Bien, j'ai trouvé de nombreuses questions liées qui sont dupliquées à cette question, et la plupart des réponses n'étaient pas adaptées à mon cas.

    J'ai trouvé une solution qui peut convenir à la vôtre pour moi. Simplement, j'ai créé un ImageView personnalisé et j'ai ajouté un nouveau rappel OnSizeChangedCallback appelé chaque fois que la taille de la vue est changée en valeurs non nulles.

    Voici un exemple de code de mon propre:

     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); } } 

    Et vous pouvez simplement l'utiliser comme suit:

     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 ... } }); 

    questions connexes:

    1. Views-getwidth-and-getheight-return-0
    2. Android-imageview-return-getwidth-getheight-zero
    3. Android-get-width-returns-0
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.