Je travaille sur un fragment et je veux obtenir la dimension d'un layout
contenue dans le xml
fragment 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?
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.
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(..)
}
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)