138 votes

La détermination de la taille d'un Android vue au moment de l'exécution

Je suis en train d'appliquer une animation à vue dans mon application Android après mon activité est créée. Pour ce faire, j'ai besoin de déterminer la taille actuelle de la vue, puis mis en place une animation à l'échelle de la taille actuelle à la nouvelle taille. Cette partie doit être fait au moment de l'exécution, depuis le point de vue des échelles de tailles différentes en fonction de l'entrée de l'utilisateur. Ma mise en page est définie en XML.

Cela semble comme une tâche facile, et il ya beaucoup de questions concernant ce sujet mais aucun ne qui a résolu mon problème, évidemment. Alors peut-être que je suis absent quelque chose d'évident. Je reçois une poignée à mon avis par:

ImageView myView = (ImageView)getWindow().findViewById(R.id.MyViewID);

Cela fonctionne bien, mais lors de l'appel d' getWidth(), getHeight(), getMeasuredWidth(), getLayoutParams().width, etc., ils retournent tous 0. J'ai aussi essayé manuellement appelant measure() sur la vue suivi par un appel à getMeasuredWidth(), mais n'a pas d'effet.

J'ai essayé d'appeler ces méthodes et l'inspection de l'objet dans le débogueur dans mon activité, en onCreate() et onPostCreate(). Comment puis-je déterminer les dimensions exactes de ce point de vue au moment de l'exécution?

190voto

Vikram Bodicherla Points 3855

Utiliser le ViewTreeObserver sur la Vue à attendre pour le premier modèle. Seulement après la première mise en page getWidth () et getHeight()/getMeasuredWidth()/getMeasuredHeight ().

ViewTreeObserver viewTreeObserver = view.getViewTreeObserver();
if (viewTreeObserver.isAlive()) {
  viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
      view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
      viewWidth = view.getWidth();
      viewHeight = view.getHeight();
    }
  });
}

22voto

mbaird Points 31293

Êtes-vous en faveur getWidth() avant le point de vue est en fait posé sur l'écran?

Une erreur commune faite par la nouvelle Android les développeurs est d'utiliser la largeur et la la hauteur de vue à l'intérieur de son constructeur. Lorsqu'une vue est le constructeur est appelé, Android n'est pas sais pas encore comment grand la vue sera, donc, les montants sont fixés à zéro. Le réel les tailles sont calculés lors de la mise en scène, qui se produit après de la construction, mais avant tout est dessinés. Vous pouvez utiliser le onSizeChanged( méthode pour être informé de l'valeurs lorsqu'ils sont connus, ou vous pouvez utiliser le getWidth( ) et getHeight( des méthodes plus tard, comme dans le onDraw( ) la méthode.

17voto

Nik Reiman Points 16156

@Mbaird les conseils, j'ai trouvé une solution réalisable par dérivation de l' ImageView de la classe et de l'impérieuse onLayout(). Ensuite, j'ai créé un observateur interface de mon activité mise en œuvre et a passé une référence à lui-même à la classe, ce qui lui a permis de dire à l'activité quand il a été fait terminé de dimensionnement.

Je ne suis pas convaincu à 100% que c'est la meilleure solution (d'où mes pas de marquage de cette réponse comme correcte pour le moment), mais il fonctionne et selon la documentation est la première fois que l'on peut trouver de la taille réelle d'un point de vue.

10voto

gregm Points 5441

Voici le code pour obtenir la présentation par substitution d'un point de vue si l'API < 11 (API 11 comprend le point de Vue.OnLayoutChangedListener fonction):

public class CustomListView extends ListView
{
    private OnLayoutChangedListener layoutChangedListener;

    public CustomListView(Context context)
    {
        super(context);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b)
    {
        if (layoutChangedListener != null)
        {
            layoutChangedListener.onLayout(changed, l, t, r, b);
        }
        super.onLayout(changed, l, t, r, b);
    }

    public void setLayoutChangedListener(
        OnLayoutChangedListener layoutChangedListener)
    {
        this.layoutChangedListener = layoutChangedListener;
    }
}
public interface OnLayoutChangedListener
{
    void onLayout(boolean changed, int l, int t, int r, int b);
}

7voto

Macarse Points 36519

Vous pouvez vérifier cette question. Vous pouvez utiliser l' Views' post() méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X