2010-09-23 6 views
28

Ho utilizzato un attributo layout_marginLeft="30dip" in uno stile definito per i pulsanti. Quando applico questo stile individualmente per ogni pulsante, il margine sinistro viene posizionato come volevo.Per utilizzare layout_marginLeft in uno stile di pulsante applicato come tema?

Ma poi ho definito un tema, in cui ho assegnato il mio stile pulsante all'attributo android:buttonStyle e l'ho applicato al mio progetto.
Tuttavia, la proprietà del margine sinistro viene ignorata. Qualche idea su cosa devo fare qui?

style.xml come segue:

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

risposta

3

mai arrivare a fondo di questo? Sto avendo lo stesso problema; tutti gli attributi del margine vengono ignorati quando applicati a un pulsante o ImageButton tramite uno stile all'interno di un tema.

Tuttavia, ho trovato che fa funziona quando lo stile viene applicato direttamente utilizzando l'attributo "stile" sul pulsante. Sembra che i margini non facciano parte delle specifiche "buttonStyle".

+0

bene, sono riuscito con una soluzione. Invece di impostare il margine, ho appena specificato il pulsante sotto la proprietà. per esempio, i pulsanti 2, 3 e 4 sono allineati sotto il pulsante 1. Non ho trovato altra via d'uscita. – kiki

2

Direi che si tratta di un bug in Android.

D'altra parte, quando ho iniziato ad usare gli stili ho inserito tutto nello stile. Ho notato che stavo creando uno stile per ogni widget. In questo momento, inserisco gli attributi di posizione all'interno di uno stile.

Quindi, width, height, padding e layout immobili a l'elemento XML e il resto degli attributi all'interno dello stile.

+1

Questo è un bug nel framework Android. Gli attributi layout_margin * vengono ignorati negli stili se vengono referenziati tramite il tema. – Anderson

+0

Questo è esasperante. layout_marginRight e marginLeft non vengono ignorati. Tuttavia top e bottom sono ignorati. –

10

C'è una risposta impressionante here on stackoverflow. Fondamentalmente, LayoutParams (layout_) vengono utilizzati per le viste secondarie per comunicare al genitore ViewGroup come devono essere posizionati. Ma LayoutParams sono specifici per ogni tipo ViewGroup (LinearLayout, RelativeLayout, FrameLayout ecc.) Pertanto LayoutParams non può essere generalizzato in questo modo per un tema.

Tutto questo è molto sfortunato, come non è possibile utilizzare stili completamente generalizzate in un tema, ma è comunque possibile utilizzare lo stile per ogni visualizzazione specifica dove serve, come segue:

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

In che modo, quindi, i pulsanti hanno margini di default? Come fa il quadro? – Nilzor

+1

@Nilzor i pulsanti non hanno margini, hanno grafic che ha costruito in margine/padding. Controlla la cartella delle risorse e vedrai. se si imposta l'immagine di sfondo su qualcos'altro, i pulsanti non avranno alcun margine – Warpzit

+0

Grazie. Quindi immagino che sia un approccio che chiunque può progettare i propri pulsanti. – Nilzor

13

Sembra questo può essere ottenuto avvolgendo un tag inserto attorno alla forma.

Ti piace questa:

<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

dopo molti tentativi questo è stato l'unico che funziona per me, grazie. – kometonja

0

Risposta breve: Se si specifica layout_margin in uno stile personalizzato, questo stile deve essere applicato in modo esplicito ad ogni singolo vista che si desidera avere il margine specificato (come si vede nell'esempio di codice riportato di seguito). Includere questo stile in un tema e applicarlo alla tua applicazione o un'attività non funzionerà.

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

Spiegazione: attributi che iniziano con layout_ sono LayoutParams, o una delle sue sottoclassi (per esempio MarginLayoutParams). LayoutParams vengono utilizzati dalle viste per comunicare al genitore ViewGroup come desiderano essere disposti.Ogni classe ViewGroup implementa una classe nidificata che estende ViewGroup.LayoutParams. Pertanto, LayoutParams sono specifici per il tipo di ViewGroup. Ciò significa che mentre uno TableLayout e uno LinearLayout possono entrambi avere layout_margin come uno di esso è LayoutParams, sono considerati attributi completamente diversi.

Quindi layout_margin non è solo un attributo generale che può essere applicato ovunque. Deve essere applicato nel contesto di un ViewGroup che lo definisce specificamente come argomento valido. Una vista deve essere consapevole del tipo della sua madre ViewGroup quando si applica LayoutParams.

Specificare layout_margin in uno stile, incluso quello stile in un tema, e tentare di applicare quel tema a un'applicazione/attività comporterà la caduta degli attributi di layout, perché nessun genitore di ViewGroup è stato ancora specificato e quindi gli argomenti sono non valido. Tuttavia, l'applicazione dello stile a una vista EditText che è stata definita con un TableLayout funziona, poiché è noto il genitore ViewGroup (TableLayout).

Fonti:

documentazione Android su Layout Parameters.

Risposta data a this question dall'ingegnere di framework Android e dall'utente StackOverflow adamp.

Inoltre, rispondere a this question da StackOverflow utente inazaruk.

Non voglio alcun credito di questa risposta il vero eroe è qui - https://stackoverflow.com/a/13365288/4741746