Je souhaite que la marge par défaut pour EditText soit 10dp. Par conséquent, dans mon fichier styles.xml, j'ai configuré ce qui suit:
<resources xmlns:Android="http://schemas.Android.com/apk/res/Android">
<style name="MyTheme" parent="Android:style/Theme.NoTitleBar">
<item name="Android:editTextStyle">@style/edit_text_default</item>
</style>
<style name="edit_text_default" parent="Android:style/Widget.EditText">
<item name="Android:layout_margin">10dp</item>
</style>
</resources>
Ensuite, dans AndroidManifest.xml, je règle le thème des applications sur celui que j'ai défini:
<application
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name"
Android:theme="@style/MyTheme" >
...
L'aspect "Aucune barre de titre" du thème fonctionne. Cependant, la marge par défaut pour EditText n'est pas, elle remplit toujours le parent. Voici ma vue de table:
<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" />
</TableRow>
<TableRow>
<EditText Android:hint="@string/first_name" />
</TableRow>
</TableLayout>
Réponse courte: Si vous spécifiez layout_margin dans un style personnalisé, ce style doit être explicitement appliqué à chaque vue individuelle pour laquelle vous souhaitez avoir la marge spécifiée (comme illustré 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: Les attributs commençant par layout_
sont LayoutParams , ou l'une de ses sous-classes (par exemple, MarginLayoutParams ). LayoutParams
sont utilisés par les vues pour indiquer à leurs parents ViewGroup comment ils veulent être disposés. Chaque classe ViewGroup
implémente une classe imbriquée qui étend ViewGroup.LayoutParams
. Par conséquent, LayoutParams
sont spécifiques au type ViewGroup
. Cela signifie que même si TableLayout
et LinearLayout
peuvent tous les deux avoir 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 simplement 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 argument valide. Une vue doit être conscient du type de son parent ViewGroup
lorsque LayoutParams
sont appliqués.
Si vous spécifiez layout_margin dans un style, y compris ce style dans un thème, et tentez d'appliquer ce thème à une application/activité, les attributs de présentation seront supprimés, car aucun parent ViewGroup n'a encore été spécifié et les arguments ne sont pas valides. Cependant, appliquer le style à une vue EditText
définie avec un TableLayout
fonctionne, car le parent ViewGroup
(le TableLayout
) est connu.
Sources:
Documentation Android sur Paramètres de mise en page .
Réponse donnée à à cette question par l’ingénieur cadre Android et l’utilisateur StackOverflow adamp .
En outre, la réponse donnée à cette question par l'utilisateur StackOverflow inazaruk .
Vous n'utilisez pas le nom de thème correct dans votre manifeste. Essayez de le changer pour:
<application
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name"
Android:theme="@style/MyTheme" >
Au cas où cela serait utile aux autres, j'aimerais apporter la réponse d’Oliv à une autre SO question ici. J'essayais d’ajouter des marges à tous les boutons et j’ai trouvé layout_margin ne fonctionne pas.
Le thème:
<style name="FooThemeStyle" parent="Base.Theme.AppCompat">
<item name="Android:buttonStyle">@style/FooButton</item>
<item name="buttonStyle">@style/FooButton</item>
</style>
Le style du bouton:
<style name="FooButton" parent="Widget.AppCompat.Button">
<item name="Android:background">@drawable/button_background</item>
</style>
Voici button_background.xml où la réponse d'Oliv à un autre SO question est utilisée pour définir la marge sur 2dp::
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item
Android:bottom="2dp"
Android:left="2dp"
Android:right="2dp"
Android:top="2dp">
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
...
</selector>
</item>
</layer-list>