2010-09-23 3 views
28

Ich verwendete ein Attribut layout_marginLeft="30dip" in einem für Schaltflächen definierten Stil. Wenn ich diesen Stil für jede Taste einzeln anwende, wird der linke Rand so platziert, wie ich es wollte.Um layout_marginLeft in einem Schaltflächenstil zu verwenden, der als Thema angewendet wird?

Aber dann habe ich ein Thema definiert, wo ich meine Schaltfläche Stil dem Attribut zugewiesen und es auf mein Projekt angewendet.
Die Eigenschaft für den linken Rand wird jedoch ignoriert. Irgendeine Idee, was ich hier tun muss?

style.xml wie folgt:

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

Antwort

3

überhaupt auf den Grund gehen? Ich habe das gleiche Problem; Alle Randattribute werden ignoriert, wenn sie über einen Stil innerhalb eines Designs auf einen Button oder ImageButton angewendet werden.

Allerdings habe ich es gefunden funktioniert arbeiten, wenn der Stil direkt mit dem Attribut "Stil" auf der Schaltfläche angewendet wird. Es scheint, dass Ränder nicht Teil der "ButtonStyle" -Spezifikation sind.

+0

gut, ich mit einer Vermeidung des Problems geführt. Anstatt die Marge zu setzen, habe ich nur die Schaltfläche unterhalb der Eigenschaft angegeben. d. h., die Knöpfe 2, 3 und 4 sind zum Beispiel unterhalb von Knopf 1 angeordnet. Ich habe keinen anderen Ausweg gefunden. – kiki

2

Ich würde vermuten, das ist ein Fehler in Android.

Auf der anderen Seite, als ich anfing, Stile zu verwenden, legte ich alles in den Stil. Ich habe bemerkt, dass ich einen Stil für jedes Widget erstellt habe. Momentan platziere ich Positionsattribute in einem Stil.

So width, height, padding und layout Objekte im XML-Elemente und der Rest der Attribute innerhalb des Stils.

+1

Dies ist ein Fehler im Android Framework. layout_margin * Attribute werden in Stilen ignoriert, wenn sie durch Theme referenziert werden. – Anderson

+0

Das ist ärgerlich. layout_marginRight und marginLeft werden nicht ignoriert. Oben und unten werden jedoch ignoriert. –

10

Es gibt eine tolle Antwort here on stackoverflow. Grundsätzlich werden LayoutParams (layout_) für untergeordnete Ansichten verwendet, um ihrem übergeordneten Element ViewGroup mitzuteilen, wie sie positioniert werden sollen. Aber LayoutParams sind spezifisch für jeden ViewGroup Typ (LinearLayout, RelativeLayout, FrameLayout usw.), so LayoutParams kann nicht auf diese Weise für ein Thema verallgemeinert werden.

All dies sehr bedauerlich ist, da Sie nicht völlig verallgemeinert Stile in einem Thema verwenden können, aber Sie können immer noch den Stil für jede spezifische Ansicht verwenden, wo Sie es brauchen, wie folgt vor:

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

Wie haben die Buttons standardmäßig Ränder? Wie macht es das Framework? – Nilzor

+1

@Nilzor Tasten haben keine Ränder, sie haben Grafik, die in Rand/Padding eingebaut hat. Überprüfen Sie den Ressourcenordner und Sie werden sehen. Wenn Sie die Hintergrundgrafik auf etwas anderes einstellen, haben die Tasten keinen Rand. – Warpzit

+0

Danke. Also denke ich, dass das ein Ansatz ist, den jeder, der seine eigenen Buttons gestaltet, auch mitnehmen kann. – Nilzor

13

Es sieht aus wie Dies kann erreicht werden, indem ein Einfügungs-Tag um die Form gewickelt wird.

So:

<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

nach vielen Versuchen war dies das einzige, das für mich funktioniert, danke. – kometonja

0

Kurze Antwort: Wenn Sie in einem benutzerdefinierten Stil angeben layout_margin, muss dieser Stil explizit auf jede einzelne Ansicht angewendet werden, die die angegebene Marge haben möchten (wie gesehen im Codebeispiel unten). Wenn Sie diesen Stil in ein Design einfügen und ihn auf Ihre Anwendung oder eine Aktivität anwenden, funktioniert das nicht.

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

Erläuterung: Attribute, die mit layout_ beginnen LayoutParams sind, oder einer ihrer Unterklassen (z.B. MarginLayoutParams). LayoutParams werden von Ansichten verwendet, um ihren Eltern mitzuteilen, ViewGroup, wie sie angelegt werden sollen.Jede Klasse implementiert eine verschachtelte Klasse, die ViewGroup.LayoutParams erweitert. Daher sind LayoutParams spezifisch für den Typ ViewGroup. Dies bedeutet, dass, während ein TableLayout und ein LinearLayout beide layout_margin als eines von ihnen LayoutParams haben können, sie als völlig unterschiedliche Attribute betrachtet werden.

Also layout_margin ist nicht nur ein allgemeines Attribut, das überall angewendet werden kann. Es muss im Rahmen eines ViewGroup angewendet werden, der es speziell als ein gültiges Argument definiert. Eine Sicht muss aware des Typs des übergeordneten Elements ViewGroup sein, wenn LayoutParams angewendet werden. Wenn Sie layout_margin in einem Stil angeben, einschließlich dieses Stils in einem Design, und versuchen, dieses Design auf eine Anwendung/Aktivität anzuwenden, werden die Layoutattribute gelöscht, da noch kein ViewGroup-Parent angegeben wurde und die Argumente somit vorhanden sind ungültig. Das Anwenden des Stils auf eine EditText Ansicht, die mit einer TableLayout definiert wurde, funktioniert jedoch, da der Stamm ViewGroup (der TableLayout) bekannt ist.

Quellen:

Android-Dokumentation auf Layout Parameters.

Antwort gegeben this question von Android Framework Engineer und StackOverflow Benutzer adamp.

Antwort auch gegeben this question von StackOverflow Benutzer inazaruk.

Ich möchte nicht jede Kredit dieser Antwort die echter Held ist hier - https://stackoverflow.com/a/13365288/4741746