ImageView.getWidth()返回0

Gee*_*eek 19 java android android-imageview android-activity

我得到imageView的宽度0.下面是代码.

xml文件:

<ImageView
        android:id="@+id/img"
        android:layout_width="200dp"
        android:layout_height="200dp" />
Run Code Online (Sandbox Code Playgroud)

活动:

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

我不想使用下面的代码,因为我需要将这些代码放在很多地方.

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;
        }
    });
Run Code Online (Sandbox Code Playgroud)

我的解决方法: 我实际上后来不需要在活动中添加此代码.我将它添加到非活动类而不是ImageView的宽度我使用了Bitmap图像的宽度,现在没有这个问题.

San*_*ela 42

当你打电话getWidth(),并getHeight()在ImageView的?如果您从onCreate()活动中拨打电话,则无法使用.您需要等待附加活动窗口,然后调用getWidth() and getHeight()ImageView.您可以尝试getWidth() and getHeight()onWindowFocusChanged()您的活动方法中调用.

以这种方式调用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());
     }

    }
Run Code Online (Sandbox Code Playgroud)


lin*_*kis 9

既然你已经拥有200dp的"固定"宽度imageView,为什么不把它放在dimens.xml中呢?

<dimen name="image_width">200dp</dimen>
Run Code Online (Sandbox Code Playgroud)

然后简单地说

int width = (int) getResources().getDimension(R.dimen.image_Width)
Run Code Online (Sandbox Code Playgroud)