2013-10-09 35 views
14

我得到imageView的寬度0.下面是代碼。ImageView.getWidth()返回0

XML文件:

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

活動:

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

我的解決方法: 其實我後來也沒必要在活動中添加此代碼。我將它添加到非活動類,而不是ImageView的寬度,我使用了位圖圖像的寬度,現在不存在這個問題。

+0

在onResume中,屏幕尚未佈置,所有組件仍然是0x0。考慮調用getMeasuredWidth,或在佈局完成後調用它。 – njzk2

+1

@ njzk2 getMeasuredWidth()也返回0. – Geek

回答

32

您在ImageView上致電getWidth()getHeight()?如果您在活動中致電onCreate(),則它不起作用。您需要等待附加的活動窗口,然後在ImageView上調用getWidth() and getHeight()。您可以嘗試從onWindowFocusChanged()中調用getWidth() and getHeight()您的活動方法。

通話onWindowFocusChanged像這樣

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

它何時調用? – Geek

+0

啓動方法被調用後... –

+1

onStart之後不調用onResume嗎?我把我的代碼放在了onResume中。 – Geek

7

既然你已經有200dp「固定的」寬度ImageView的你爲什麼不把它放在dimens.xml

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

,然後只是

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

這只是一個例子。我爲許多圖像視圖使用此代碼,並不是所有的都有修復大小。有些使用wrap_content。 – Geek

+1

getWidth和getHeight可能因設備分辨率不同而不同,因此您不能像這樣使用 –

+0

好吧...您爲此投票了嗎?你應該使用更好的例子:P @SanketKachhela這是不正確的,dimens資源照顧(如果我們正在談論預定義的大小(如在原始問題中使用的那樣) – linakis

2

以及我發現很多很多問題都是重複的這個問題,大部分答案都不適合我的情況。

我已經想出了一個適合您的解決方案,因爲它適合我。簡單地說,我創建了一個自定義的ImageView並添加了一個新的回調OnSizeChangedCallback,只要視圖的大小更改爲非零值,就會調用該回調。

這是我自己的代碼示例:

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

,你可以按照如下簡單地使用它:

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

相關的問題:

  1. views-getwidth-and-getheight-returning-0
  2. android-imageview-return-getwidth-getheight-zero
  3. android-get-width-returns-0