23

我得到 imageView 的宽度 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 的宽度,我使用了位图图像的宽度,现在没有这个问题。

4

4 回答 4

50

你在哪里打电话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());
     }

    }
于 2013-10-09T12:11:07.267 回答
9

既然你已经有一个 200dp 的“固定”宽度 imageView 为什么不把它放在 dimens.xml

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

然后简单地

int width = (int) getResources().getDimension(R.dimen.image_Width)
于 2013-10-09T12:25:29.097 回答
3

好吧,我发现许多与此问题重复的相关问题,并且大多数答案都不适合我的情况。

我想出了一个可能适合你的解决方案,就像它适合我一样。简单地说,我创建了一个自定义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. 视图-getwidth-and-getheight-returning-0
  2. android-imageview-return-getwidth-getheight-零
  3. android-get-width-returns-0
于 2013-10-18T05:32:25.570 回答
2

您需要等待 ImageView 膨胀。来试试OnLayoutChangeListener

        imageView.addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
            //
            if (imageView.getWidth() > 0 && imageView.getHeight() > 0) {
                // put your code here...
            }
        });
于 2020-08-27T02:37:52.033 回答