Définition des paramètres de mise en page dans android

travailler avec le fichier XML était facile car je pouvais spécifier les paramètres comme

<android:layout_width="fill_parent" android:layout_height="wrap_content">

mais je suis confus en le spécifiant par le code. Pour chaque vue, je spécifie les paramètres en utilisant

view.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT)); 

je vois que j'ai une option de le spécifier comme layout relatif, frame layout etc. A partir de Maintenant j'utilise la mise en page linéaire pour toutes les vues telles que les images, le texte et aussi gridview. Si les paramètres de vue sont définis sur la base mise en page de l'élément parent? Ou est-il correct de le spécifier comme disposition linéaire même si la vue est un enfant de, disons, un framelayout? Désolé, mais je n'arrivais pas à trouver la différence.

16
demandé sur Jerrin George 2011-06-23 16:20:28

2 réponses

toutes les classes de présentation ( LinearLayout , RelativeLayout , etc.) étendre ViewGroup .

la classe ViewGroup comprend deux classes intérieures statiques: LayoutParams et MarginLayoutParams . Et ViewGroup.MarginLayoutParams étend en fait ViewGroup.LayoutParams .


parfois, les classes de mise en page ont besoin d'informations supplémentaires pour être associées à la vue des enfants. Pour cela, ils définissent leur classe statique interne LayoutParams . Par exemple, LinearLayout a:

public class LinearLayout extends ViewGroup {
   ...
   public static class LayoutParams extends ViewGroup.MarginLayoutParams {  
   ...
   }
}

même chose pour RelativeLayout :

public class RelativeLayout extends ViewGroup {
   ...
   public static class LayoutParams extends ViewGroup.MarginLayoutParams {  
   ...
   }
}

mais LinearLayout.LayoutParams et RelativeLayout.LayoutParams sont des classes indépendantes complètement différentes. Ils contiennent différents renseignements supplémentaires sur les opinions des enfants.

par exemple, LinearLayout.LayoutParams peut associer weight valeur à chaque vue, tandis que RelativeLayout.LayoutParams ne peut pas. Même chose avec RelativeLayout.LayoutParams : il peut associer des valeurs comme above , below , alightWithParent avec chaque vue. Et LinearLayout.LayoutParams n'ont tout simplement pas ces capacités.


donc en général, vous devez utiliser LayoutParams de la disposition de l'enveloppe pour rendre votre vue correctement positionnée et rendue. Mais notez que tous les LayoutParams ont la même classe de parent ViewGroup.LayoutParams . Et si vous n'utilisez que des fonctionnalités qui sont définies dans cette classe (comme dans votre cas WRAP_CONTENT et FILL_PARENT ) vous pouvez obtenir le code de travail, même si vous vous trompez La classe LayoutParams a été utilisée pour spécifier les paramètres de mise en page.

17
répondu inazaruk 2011-06-23 12:47:46

en fonction du nombre de vues sur lesquelles vous voulez modifier la disposition, je pense qu'il est préférable de créer une méthode d'assistant et passer toutes les vues que vous voulez changer à la méthode avec les valeurs de hauteur et de largeur que vous voulez qu'ils changent en:

public void setWidthHeight(View v, int width, int height){
    LayoutParams lp;
    lp = v.getLayoutParams();
    lp.width = width;
    lp.height = height;
    v.setLayoutParams(lp);
}

rappelez-vous que définir la largeur et la hauteur ici ne vont pas correspondre aux mêmes valeurs dans votre xml, i.e., android:layout_width=" 32dp " n'est pas la même chose que lp.Largeur = 32;

aussi, le LayoutParams type variable appelée lp doit être du type retourné par votre vue... Vérifiez quel type est retourné par la vue et importez ce type dans vos déclarations d'importation.

10
répondu Sandy Simonton 2012-05-01 22:37:56