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?
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();
}
});
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();
}
}
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.
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).
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();
}
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());
}
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.
essayez avec ce metods:
int width = mView.getMeasuredWidth();
int height = mView.getMeasuredHeight();
Ou
int width = mTextView.getMeasuredWidth();
int height = mTextView.getMeasuredHeight();
Dans Kotlin, vous pouvez simplement faire ceci:
fr.post {
height=fr.height
width=fr.width
}
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.
Pour cadre:
height=fr.getHeight();
width=fr.getWidth();
Pour l'écran:
width = getWindowManager().getDefaultDisplay().getWidth();
height = getWindowManager().getDefaultDisplay().getHeight();
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.
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 !!!
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
}