J'obtiens la largeur 0 de imageView. Ci-dessous le code.
fichier xml:
<ImageView
Android:id="@+id/img"
Android:layout_width="200dp"
Android:layout_height="200dp" />
Activité:
@Override
protected void onResume() {
super.onResume();
ImageView img = (ImageView) findViewById(R.id.img);
Log.d(TAG, "width : " + img.getWidth());
}
Je ne veux pas utiliser le code ci-dessous car j'ai besoin de placer ce code dans tant d'endroits.
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;
}
});
Ma solution: En fait, plus tard, je n'ai pas eu besoin d'ajouter ce code dans une activité. Je l'ai ajouté à une classe sans activité et au lieu de la largeur d'ImageView, j'ai utilisé la largeur de l'image Bitmap et n'a plus ce problème.
Où appelez-vous getWidth()
et getHeight()
sur ImageView? Si vous appelez de onCreate()
en activité, cela ne fonctionnera pas. Vous devez attendre que la fenêtre d'activité soit attachée, puis appeler getWidth() and getHeight()
sur ImageView. Vous pouvez essayer d'appeler getWidth() and getHeight()
à partir de la méthode onWindowFocusChanged()
de votre activité.
appeler onWindowFocusChanged comme ceci
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());
}
}
Puisque vous avez déjà une image de largeur "fixe" Vue de 200dp pourquoi ne pas simplement la mettre dans dimens.xml
<dimen name="image_width">200dp</dimen>
puis simplement
int width = (int) getResources().getDimension(R.dimen.image_Width)
eh bien j'ai trouvé beaucoup de questions liées qui sont en double à cette question, et la plupart des réponses n'étaient pas adaptées à mon cas.
J'ai trouvé une solution qui peut convenir à la vôtre comme à moi. Simplement, j'ai créé un ImageView
personnalisé et ajouté un nouveau callback OnSizeChangedCallback
qui est appelé chaque fois que la taille de la vue est modifiée en valeurs non nulles.
Voici un échantillon de mon code:
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);
}
}
et vous pouvez simplement l'utiliser comme suit:
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 ...
}
});
questions connexes: