Si j'appelle getMeasuredWidth () ou getWidth () pour la présentation dans onResume, ils retournent 0. Je pense que cette vue n'est pas encore dessinée pour l'instant.
De plus, je pense que je dois mettre getMeasuredWidth () ou getWidth () dans la méthode de rappel appelée après que la disposition a été dessinée et que les mesures d'affichage sont connues . Quelle méthode de rappel Android dois-je utiliser?
Vous ne pouvez pas utiliser width
/height
/getMeasuredWidth
/getMeasuredHeight
sur un View
avant que le système l'ait rendu (généralement à partir de onCreate
/onResume
).
La solution simple consiste à poster un Runnable
dans la mise en page. Le runnable sera exécuté après que le View
ait été aménagé.
BoxesLayout = (RelativeLayout) findViewById(R.id.BoxesLinearLayout);
BoxesLayout.post(new Runnable() {
@Override
public void run() {
int w = BoxesLayout.getMeasuredWidth();
int h = BoxesLayout.getMeasuredHeight();
...
}
});
Cette réponse dit:
Utilisez la ViewTreeObserver
sur la View
pour attendre la première mise en page. getWidth()/getHeight()/getMeasuredWidth()/getMeasuredHeight()
fonctionne uniquement après la première mise en page.
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();
}
});
}
vous pouvez remplacer onLayout () à votre avis; Ceci est utilisé par Android pour positionner chacun des enfants de la vue afin que vous puissiez faire ce que vous voulez faire après l'appel super(..)
.
En effet, il semble 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 est d'appeler la méthode measure () avant d'appeler getMeasuredWidth () 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 aide, Mihai
Manière plus simple:
view.post(new Runnable() {
public void run() {
view.getWidth();
}
}
);
http://developer.Android.com/reference/Android/view/View.html#post(Java.lang.Runnable)
Solution n ° 1: Pour le faire dynamiquement, vous avez besoin d'une balise. Une balise est fondamentalement un moyen pour les vues d’avoir des souvenirs. Enregistrez donc le convertView dans une autre classe (MyTag). Donc dans votre fichier Java:
private LayoutInflater layoutInflater;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyTag holder = null;
View row = convertView;
if (row == null) {
//Inflate the view however u can
String strInflater = Context.LAYOUT_INFLATER_SERVICE;
layoutInflater = (LayoutInflater) context.getSystemService(strInflater);
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(layoutResID, parent, false);
holder = new MyTag();
holder.itemName = (TextView) row.findViewById(R.id.example_itemname);
holder.icon = (ImageView) row.findViewById(R.id.example_image);
holder.button1 = (Button) row.findViewById(R.id.swipe_button1);
holder.button2 = (Button) row.findViewById(R.id.swipe_button2);
holder.button3 = (Button) row.findViewById(R.id.swipe_button3);
row.setTag(holder);
} else {
holder = (MyTag) row.getTag();
}
holder.itemName.setText(itemdata.getItemName());
System.out.println("holder.button3.getMeasuredWidth()= "+ holder.button3.getMeasuredWidth());
System.out.println("holder.button3.getWidth()= "+ holder.button3.getWidth());
return row;
} //End of getView()
static class MyTag { //It also works if not static
TextView itemName;
ImageView icon;
Button button1;
Button button2;
Button button3;
}
Solution n ° 2: Codez-le en dur. Préréglez la largeur. Dans votre fichier res/values / dimens.xml, incluez
<dimen name="your_button_width">50dp</dimen>
Puis, dans votre fichier res/layout/your_layout.xml, incluez
<Button
Android:layout_width="@dimen/your_button_width" />
Puis dans votre fichier Java:
int buttonSize= (int) (context.getResources().getDimension(R.dimen.your_button_width));
Utilisez le code ci-dessous:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
Log.e("WIDTH",""+view.getWidth());
Log.e("HEIGHT",""+view.getHeight());
}