web-dev-qa-db-fra.com

Obtenir la hauteur et la largeur d'une mise en page par programme

J'ai conçu une mise en page dans laquelle LinearLayout a 2 enfants LinearLayout et FrameLayout et dans chaque enfant, je mets des vues différentes.

Je voulais juste mesurer la hauteur et la largeur de FrameLayout pour pouvoir remplir mes fonctions.

Dans le programme j'utilise

int height,width;

FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);
height=fr.getHeight();
width=fr.getWidth();

renvoie la valeur sous la forme 0 pour les deux

Même j'ai essayé avec le code suivant int hauteur, largeur;

FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);
height=fr.getMeasuredHeight();
width=fr.getMeasuredWidth();

retourne la même valeur 0

et finalement j'ai essayé avec le code suivant, int height, width;

FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);
height=fr.getgetLayoutParams().height();
width=fr.getLayoutParams().width;

me retourne -2 et -1

Je veux la solution pour obtenir la hauteur et la largeur de toute disposition par programme?

49
Rohit

La vue elle-même a son propre cycle de vie qui est essentiellement le suivant:

  • Attaché

  • Mesuré

  • Disposition

  • Dessiner

Ainsi, en fonction du moment où vous essayez d'obtenir la largeur/hauteur, vous pourriez ne pas voir ce que vous espérez voir, par exemple, si vous le faites pendant onCreate, la vue peut même ne pas avoir été mesurée à cette heure-là. Si vous le faites lors de la méthode onClick d'un bouton, il est probable que cette vue a de loin été attachée, mesurée, mise en forme et dessinée. Ainsi, vous verrez la valeur attendue, vous devez implémenter un ViewTreeObserver pour vous assurer d'obtenir le résultat souhaité. valeurs au bon moment.

LinearLayout layout = (LinearLayout)findViewById(R.id.YOUD VIEW ID);
ViewTreeObserver vto = layout.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                this.layout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            } else {
                this.layout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            } 
        int width  = layout.getMeasuredWidth();
        int height = layout.getMeasuredHeight(); 

    } 
});
120
Martin Cazares

Comme CapDroid le dit, vous essayez d’obtenir la taille avant la vue dessinée, une autre solution possible serait de faire une publication avec un runnable sur la vue:

mView.post(new Runnable() {
        @Override
        public void run() {
            int width = mView.getWidth();
            int height = mView.getHeight();
        }
}
18
Julian

Je pense que vous obtenez Height et Width dans la méthode OnCreate (), c’est pourquoi vous obtenez toujours des valeurs de 0, car à ce moment-là, votre vue n’a toujours pas été créée.

Essayez d’obtenir de la hauteur et de la largeur sur un clic de bouton ou autre chose.

14
Niranj Patel

Si vous obtenez -1 ou -2, il peut également s'agir de la valeur numérique de LayoutParams.WRAP_CONTENT (-2) ou LayoutParams.MATCH_PARENT (-1).

6

donnez simplement votre taille et vous obtiendrez une hauteur ou même une largeur si vous le souhaitez.

/ ** * Obtenir la hauteur de la vue avant que la vue ne soit rendue * @param view la vue à mesurer * @return la hauteur de la vue * /

public static int getViewHeight(View view) {
    WindowManager wm =
            (WindowManager) view.getContext().getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();

    int deviceWidth;

    if(Android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2){
        Point size = new Point();
        display.getSize(size);
        deviceWidth = size.x;
    } else {
        deviceWidth = display.getWidth();
    }

    int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(deviceWidth, View.MeasureSpec.AT_MOST);
    int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
    view.measure(widthMeasureSpec, heightMeasureSpec);
    return view.getMeasuredHeight(); //        view.getMeasuredWidth();
}
6
Siddhesh Shirodkar

J'avais le même problème, mais je ne voulais pas dessiner à l'écran avant de mesurer. J'ai donc utilisé cette méthode pour mesurer la vue avant d'essayer d'obtenir la hauteur et la largeur.

Exemple d'utilisation:

layoutView(view);
int height = view.getHeight();

//...

void layoutView(View view) {
    view.setDrawingCacheEnabled(true);
    int wrapContentSpec = 
        MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
    view.measure(wrapContentSpec, wrapContentSpec);
    view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
}
3
Asaf

Le moyen le plus simple consiste à utiliser ViewTreeObserver. Si vous utilisez directement .height ou .width, vous obtenez une valeur égale à 0, car les vues ne sont pas dimensionnées tant qu'elles ne s'affichent pas sur notre écran. L'exemple suivant montre comment utiliser ViewTreeObserver

ViewTreeObserver viewTreeObserver = YOUR_VIEW_TO_MEASURE.getViewTreeObserver();
        if (viewTreeObserver.isAlive()) {
            viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {

                    YOUR_VIEW_TO_MEASURE.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    int viewHeight = YOUR_VIEW_TO_MEASURE.getHeight();
                    int viewWeight = YOUR_VIEW_TO_MEASURE.getWidth();

                }
            });
        }

si vous devez utiliser cette méthode on, utilisez-la comme ceci et pour enregistrer les valeurs, vous pouvez utiliser des variables globle.

3
Chathura Jayanath

essayez avec ce metods:

int width = mView.getMeasuredWidth();

int height = mView.getMeasuredHeight();

Ou

int width = mTextView.getMeasuredWidth();

int height = mTextView.getMeasuredHeight();
3
jmorales

Dans Kotlin, vous pouvez simplement faire ceci:

fr.post {
    height=fr.height
    width=fr.width
}
2
Dan Bray

Le premier extrait est correct, mais vous devez l'appeler afteronMeasure() est exécuté. Sinon, la taille n'est pas encore mesurée pour la vue.

1
sergej shafarenka

Pour cadre:

height=fr.getHeight();
width=fr.getWidth();

Pour l'écran:

width = getWindowManager().getDefaultDisplay().getWidth();
height = getWindowManager().getDefaultDisplay().getHeight();
1
Vamshi

essayez quelque chose comme ce code de this link

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

j'espère que cela t'aides.

0
i.n.e.f

J'ai utilisé DisplayMetrics pour obtenir la taille de l'écran, puis je peux attribuer la largeur/hauteur à un élément en% age

Ce sera comme ça

DisplayMetrics dmetrics = new DisplayMetrics();
int widthPixels=dmetrics.widthPixels;
int heightPixels=dmetrics.heightPixels;       

//setting the height of the button 
button_nextPuzzle.setMinHeight((int) ((heightPixels/3)*.30));

Travaillé pour moi très bien !!!

0
chetan

Comme je venais de rencontrer ce problème, je pensais l'écrire pour Kotlin,

my_view.viewTreeObserver.addOnGlobalLayoutListener {
       // here your view is measured
       // get height using my_view.height
       // get width using my_view.width
    }

ou

my_view.post {
       // here your view is measured
       // get height using my_view.height
       // get width using my_view.width
    }
0
Aziz