web-dev-qa-db-fra.com

Si j'appelle getMeasuredWidth () ou getWidth () pour une présentation dans onResume, ils renvoient

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?

38
mobiledev Alex

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();

        ...
    }
});
75
Adorjan Princz

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();
    }
  });
}
36
Jeff Axelrod

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(..).

5
MrJre

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

4
r1k0

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)

3
Wonson

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));
1
Gene

Utilisez le code ci-dessous:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
   super.onWindowFocusChanged(hasFocus);
   Log.e("WIDTH",""+view.getWidth());
   Log.e("HEIGHT",""+view.getHeight());
}
0
Asif Patel