web-dev-qa-db-fra.com

Android obtenir la hauteur et la largeur de la mise en page dans un fragment

Je travaille sur un fragment et je veux obtenir la dimension d'un layout contenue dans le xmlfragment layout. Quand j'essaie le code

RelativeLayout myLayout = view.findViewById(R.id.myLayout);
myLayout.getHeight();

il retourne 0. J'ai besoin de ces dimensions pour mettre à l'intérieur d'autres objets MyLayout.

J'essaie d'utiliser:

myLayout.getViewTreeObserver().addOnGlobalLayoutListener( 
    new ViewTreeObserver.OnGlobalLayoutListener(){

        @Override
        public void onGlobalLayout() {
            mHeight = myLayout.getHeight();  
            mWidth= myLayout.getWidth();
            System.out.println("width: "+mWidth+"   height: "+mHeight);
         }
});

mais ce code est invoqué beaucoup de temps et je ne sais pas exactement quand il est exécuté. J'ai besoin de ces dimensions dans public void onActivityCreated () méthode. Est-il possible?

19
lory105

Il y a une solution plus propre à cela, utilisez simplement la méthode View.post() sur la vue racine de votre fragment et vous pouvez appeler getMeasuredHeight()/getMeasuredWidth() et obtenir les valeurs réelles.

Par exemple.

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View root = inflater.inflate(R.layout.myfragment, container, false);

    root.post(new Runnable() {
        @Override
        public void run() {
            // for instance
            int height = root.getMeasuredHeight(); 
        }
    });

    return root;
}

Très soigné et bien rangé et pas de mucking désordonné avec le ViewTreeObserver.

J'ai seulement testé cela avec des appareils Android-23, mais l'API a eu cette méthode depuis le niveau 1.

Quoi qu'il en soit, wfm.

22
Staffan

L'addongloballayoutlistener sera appelé chaque fois que peu de changement de la vue arrivé. Vous devez donc supprimer cet auditeur de la vue.

Utilisation simple:

public static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener listener){
if (Build.VERSION.SDK_INT < 16) {
    v.getViewTreeObserver().removeGlobalOnLayoutListener(listener);
} else {
    v.getViewTreeObserver().removeOnGlobalLayoutListener(listener);
}

}

Je vous suggérerais de vérifier:

if (myLayout.getHeight()>0 && myLayout.getWidth()>0) {
// Do some code...
removeOnGlobalLayoutListener(..)
}
10
Udi Oshi

Dans onActivityCreated, la vue n'a pas encore été mesurée.

Donc non, vous ne pouvez pas obtenir les mesures de là. onGlobalLayout est un bon endroit pour le faire. Les mises en page se produisent directement après la mesure.

Vous pouvez supprimer votre auditeur après, si vous voulez seulement le faire une fois. Notez que les mises en page peuvent modifier la taille (claviers programmables apparaissant, par exemple)

1
Bradley Campbell