Réponse courte: Si vous spécifiez layout_margin dans un style personnalisé, ce style doit être appliqué de façon explicite à chaque vue individuel que vous souhaitez avoir la marge spécifiée (comme on le voit dans l'exemple de code ci-dessous). Inclure ce style dans un thème et l'appliquer à votre application ou à une activité ne fonctionnera pas.
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFFFFF" >
<TableRow>
<EditText android:hint="@string/last_name" style="@style/edit_text_default" />
</TableRow>
<TableRow>
<EditText android:hint="@string/first_name" style="@style/edit_text_default" />
</TableRow>
</TableLayout>
Explication: attributs qui commencent par layout_
sont LayoutParams, ou une de ses sous-classes (par exemple MarginLayoutParams). LayoutParams
sont utilisés par les vues pour dire à leurs parents ViewGroup comment ils veulent être disposés.Chaque classe ViewGroup
implémente une classe imbriquée qui s'étend ViewGroup.LayoutParams
. Par conséquent, LayoutParams
sont spécifiques au type ViewGroup
. Qu'est-ce que cela signifie est que, tandis qu'un TableLayout
et un LinearLayout
peuvent avoir tous les deux layout_margin
comme l'un de ses LayoutParams
, ils sont considérés comme des attributs complètement différents.
Donc, layout_margin
n'est pas seulement un attribut général qui peut être appliqué n'importe où. Il doit être appliqué dans le contexte d'un ViewGroup
qui le définit spécifiquement comme un argument valide. Une vue doit être consciente du type de son parent ViewGroup
lorsque LayoutParams
sont appliquées. Si vous spécifiez layout_margin dans un style, y compris ce style dans un thème, et que vous tentez d'appliquer ce thème à une application/activité, les attributs de disposition sont supprimés car aucun parent ViewGroup n'a encore été spécifié et les arguments sont donc invalide. Toutefois, l'application du style à une vue EditText
qui a été définie avec un TableLayout
fonctionne, car le parent ViewGroup
(le TableLayout
) est connu.
Sources:
documentation sur Android Layout Parameters.
Réponse donnée à this question par Android Framework Engineer et utilisateur de StackOverflow adamp.
Également, réponse donnée à this question par l'utilisateur de StackOverflow inazaruk.
Je ne veux pas que tout crédit de cette réponse le vrai héros est ici - https://stackoverflow.com/a/13365288/4741746
bien
, j'ai réussi avec une solution de contournement. Au lieu de définir la marge, je viens de spécifier le bouton ci-dessous la propriété. c'est-à-dire que les boutons 2, 3 et 4 sont alignés sous le bouton 1 par exemple. Je n'ai trouvé aucun autre moyen de sortir. – kiki