40 votes

Si j'appelle getMeasuredWidth () ou getWidth() pour la mise en page dans onResume, ils retournent 0

Si j'appelle getMeasuredWidth () ou getWidth() pour la mise en page dans onResume, ils renvoient 0. Je pense que ce point de vue n'est pas encore dessiné en ce moment.

Aussi je pense que j'ai besoin de mettre getMeasuredWidth () ou getWidth() dans la méthode callback appelée après que la mise en page soit dessinée et que les mesures de vue soient connues. Quelle méthode de rappel androïde dois-je utiliser ?

79voto

Adorjan Princz Points 3601

Vous ne pouvez pas utiliser le width/height/getMeasuredWidth/getMeasuredHeight sur un View avant que le système ne le rende (généralement onCreate/onResume).

Une solution simple pour cela est de publier un Runnable dans la mise en page. Le runnable sera exécuté après la mise en page du View.

BoxesLayout = (RelativeLayout) findViewById(R.id.BoxesLinearLayout);
BoxesLayout.post(new Runnable() {
    @Override
    public void run() {
        int w = BoxesLayout.getMeasuredWidth();
        int h = BoxesLayout.getMeasuredHeight();

        ...
    }
});

37voto

Jeff Axelrod Points 8946

Cette réponse dit :

Utilisez le ViewTreeObserver sur le View pour attendre la première mise en page. Ce n'est qu'après la première mise en page que getWidth()/getHeight()/getMeasuredWidth()/getMeasuredHeight() fonctionnera.

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

5voto

MrJre Points 3725

vous pouvez remplacer onLayout() dans votre vue ; ceci est utilisé par android pour positionner chacun des enfants de la vue, afin que vous puissiez faire les choses que vous voulez y faire après l'appel super(..).

4voto

r1k0 Points 796

En effet, il apparaît que si la mise en page n'est pas affichée à l'écran, la méthode getWidth() renvoie 0. Ce qui semble fonctionner pour moi, c'est d'appeler la méthode measure() avant d'appelergetMeasuredWidth () ou getMesuredHeight(). Pour la méthode de mesure, j'ai utilisé les arguments Layout.WRAP_CONTENT pour obtenir une mesure de ce que contient la mise en page.

J'espère que ça aidera, Mihai.

3voto

Wonson Points 29

Voie plus simple :

view.post(new Runnable() {
    public void run() {
        view.getWidth();
    }
}
);

http://developer.android.com/reference/android/view/View.html#post(java.lang.Runnable)

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