2010-09-23 3 views
28

J'ai utilisé un attribut layout_marginLeft="30dip" dans un style défini pour les boutons. Lorsque j'applique ce style individuellement pour chaque bouton, la marge de gauche est placée comme je le voulais. Mais ensuite j'ai défini un thème, où j'ai assigné mon style de bouton à l'attribut android:buttonStyle et l'ai appliqué à mon projet.
Cependant, la propriété de marge de gauche est ignorée. Une idée de ce que je dois faire ici?Pour utiliser layout_marginLeft dans un style de bouton appliqué en tant que thème?

style.xml comme suit:

<style name="btnstyle" parent="@android:style/Widget.Button"> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:layout_width">wrap_content</item> 
    <item name="android:layout_marginLeft">30dip</item> 
    <item name="android:textColor">#FFFFFF</item>  
</style> 

<style name="appstyle" parent="android:Theme"> 
    <item name="android:buttonStyle">@style/btnstyle</item> 
</style> 

Répondre

3

jamais aller au fond de cette situation? J'ai le même problème; tous les attributs de marge sont ignorés lorsqu'ils sont appliqués à un Button ou à un ImageButton via un style dans un thème.

Cependant, je l'ai trouvé fonctionne lorsque le style est appliqué directement en utilisant l'attribut "style" sur le bouton. Il semble que les marges ne font pas partie de la spécification "buttonStyle".

+0

, 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

2

Je suppose que c'est un bug dans Android. D'autre part, lorsque j'ai commencé à utiliser des styles, j'ai tout placé dans le style. J'ai remarqué que je créais un style pour chaque widget. En ce moment, je place les attributs de position dans un style.

Ainsi, width, height, padding et layout propriétés dans l'élément XML et le reste des attributs à l'intérieur du style.

+1

Ceci est un bug dans le cadre android. Les attributs layout_margin * sont ignorés dans les styles s'ils sont référencés à travers le thème. – Anderson

+0

C'est exaspérant. layout_marginRight et marginLeft ne sont pas ignorés. Cependant, le haut et le bas sont ignorés. –

10

Il y a une réponse impressionnante here on stackoverflow. Fondamentalement LayoutParams (layout_) sont utilisés pour les vues enfant pour dire à leur parent ViewGroup comment ils doivent être positionnés. Mais LayoutParams sont spécifiques à chaque type ViewGroup (LinearLayout, RelativeLayout, FrameLayout etc.) donc LayoutParams ne peut pas être généralisé de cette manière pour un thème.

Tout cela est très regrettable que vous ne pouvez pas utiliser des styles complètement généralisés dans un thème, mais vous pouvez toujours utiliser le style pour chaque vue spécifique où vous en avez besoin, comme suit:

<Button style="@style/btnstyle"/> 
+0

Comment les boutons ont-ils des marges par défaut alors? Comment le cadre le fait-il? – Nilzor

+1

Les boutons @Nilzor n'ont pas de marges, ils ont du grafic qui a construit en marge/padding. Vérifiez le dossier de ressources et vous verrez. Si vous définissez le graphique d'arrière-plan à autre chose les boutons n'auront aucune marge – Warpzit

+0

Merci. Donc je suppose que c'est une approche que n'importe qui qui conçoit ses propres boutons peut prendre aussi bien. – Nilzor

13

Il ressemble ceci peut être réalisé en enveloppant une étiquette d'encarts autour de la forme.

Comme ceci:

<inset xmlns:android="http://schemas.android.com/apk/res/android" 
    android:insetLeft="5dp" 
    android:insetRight="5dp" 
    android:insetTop="5dp" 
    android:insetBottom="5dp"> 

<shape 
    android:shape="rectangle"> 
    <solid 
     android:color="#fff"/> 
    <stroke 
     android:width="1dp" 
     android:color="#333"/> 
    <corners 
     android:radius="10dp"/> 
</shape> 
</inset> 
+0

après de nombreuses tentatives ce fut le seul qui fonctionne pour moi, merci. – kometonja

0

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
Questions connexes