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の幅の代わりにビットマップ画像の幅を使用したため、この問題は発生しなくなりました。
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());
}
}
すでに200dpの「固定」幅のimageViewがあるので、dimens.xmlに入れてみませんか?
<dimen name="image_width">200dp</dimen>
そして単に
int width = (int) getResources().getDimension(R.dimen.image_Width)
よく私はこの質問と重複している多くの質問に関連する多くを見つけました、そして答えのほとんどは私のケースに適合しませんでした。
私の場合と同じように、あなたのソリューションに合うソリューションを考え出しました。単に、カスタム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 ...
}
});
関連する質問: