2013-10-09 19 views
14

döndürür. ImageView'ın genişliği 0 olsun. Kod aşağıdadır.ImageView.getWidth(), 0

xml dosyası:

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

Etkinlik: Bu kadar pek çok yerde bu kodu yerleştirmeniz gerekir olarak kodunun altına kullanmak istemiyorum

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

.

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

Benim geçici çözüm: Aslında sonradan bir aktivitede bu kodu eklemek gerek yoktu. Aktivite dışı bir sınıfa ekledim ve ImageView'ın genişliği yerine Bitmap görüntüsünün genişliğini kullandım ve şimdi bu sorun yok.

+0

, ekran henüz düzenlendiği edilmedi, tüm bileşenlerin hala 0x0 vardır. Bunun yerine getMeasuredWidth öğesini çağırmayı veya düzen bittikten sonra çağırmayı düşünün – njzk2

+1

@ njzk2 getMeasuredWidth() ayrıca 0 değerini döndürür. – Geek

cevap

32

ImageView'da getWidth() ve getHeight() numaralı telefonu nerede arıyorsunuz? Etkinlikte onCreate() numaralı telefonu arayarak işe yaramaz. Aktivite penceresinin eklenmesini beklemeniz ve ImageView üzerinde getWidth() and getHeight()'u aramanız gerekir. Etkinliğinizin onWindowFocusChanged() yönteminden getWidth() and getHeight() numaralı telefonu arama işlemini deneyebilirsiniz. Zaten 200dp bir "sabit" width imageView sahip olduğundan bu yolu gibi onWindowFocusChanged üzerinde

çağrı

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

    } 
+0

Ne zaman çağrılır? Başlatma yöntemi çağrıldıktan sonra – Geek

+0

... –

+1

OnRest sonra onResume denir değil mi? Kodumu onResume'de yerleştirdim. – Geek

7

neden sadece o dimens.xml

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

ve koyun yok sadece

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

Bu sadece bir örnektir. Bu kodu birçokImageViews için kullanıyorum ve hepsinde düzeltme boyutu yok. Bazıları wrap_content kullanın. – Geek

+1

getWidth ve getHeight, aynı görüntüler için cihaz çözünürlüğüne göre değişebilir, bu şekilde kullanamazsınız. –

+0

Tamam ... ve bunun için oy kullanma hakkınız var mı? Daha iyi örnekler kullanmalısınız: P @SanketKachhela, bu doğru değil, kaynakların önemini üstlenir (önceden tanımlanmış boyutlardan bahsediyorsak (orijinal soruda kullanılanlar gibi) – linakis

2

Bu soruyla ilgili birçok soruyla ilgili çok sayıda soru buldum, ve cevapların çoğu benim durumum için uygun değildi.

Sizin için uygun olan bir çözüm buldum. Basitçe, bir özel ImageView oluşturdum ve görünümün boyutu sıfır olmayan değerlere değiştirildiğinde, çağrılan yeni bir geri arama OnSizeChangedCallback ekledim. İşte

bir kod kendime ait örnek var:

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

ve aşağıdaki gibi basitçe kullanabilirsiniz:

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

ilgili sorular:

  1. views-getwidth-and-getheight-returning-0
  2. android-imageview-return-getwidth-getheight-zero
  3. onResume içinde
  4. android-get-width-returns-0