web-dev-qa-db-fra.com

Android - les marges spécifiées dans le style personnalisé ne prennent pas effet

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>
27
Groppe

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 .

48
Groppe

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" >
1
James McCracken

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>
0
Hong