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