web-dev-qa-db-ja.com

ImageView.getWidth()は0を返します

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の幅の代わりにビットマップ画像の幅を使用したため、この問題は発生しなくなりました。

20
Geek

ImageViewでgetWidth()およびgetHeight()を呼び出す場所はどこですか?アクティビティでonCreate()から呼び出した場合、機能しません。アクティビティウィンドウがアタッチされるのを待ってから、ImageViewでgetWidth() and getHeight()を呼び出す必要があります。アクティビティの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());
     }

    }
41
Sanket Kachhela

すでに200dpの「固定」幅のimageViewがあるので、dimens.xmlに入れてみませんか?

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

そして単に

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

よく私はこの質問と重複している多くの質問に関連する多くを見つけました、そして答えのほとんどは私のケースに適合しませんでした。

私の場合と同じように、あなたのソリューションに合うソリューションを考え出しました。単に、カスタム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-
  2. Android-imageview-return-getwidth-getheight-zero
  3. Android-get-width-returns-
3
M.ElSaka