Imposta uno stile coerente per tutti gli EditText (ad esempio)


84

Sto cercando di fare in modo che tutti EditTexti contenuti della mia applicazione abbiano un aspetto coerente. Sono consapevole di poter fare qualcosa del genere:

<style name="App_EditTextStyle">
    <item name="android:background">@drawable/filled_roundededges_box_dark</item>
    <item name="android:textColor">#808080</item>
    <item name="android:layout_height">45dip</item>
</style>

Quindi posso fare in modo che un particolare EditTextabbia questo stile in questo modo:

<EditText ...
    style="@style/App_EditTextStyle
    ...>

Ma in questo modo devo ricordarmi di impostare lo stile individualmente per ognuno EditTextnella mia applicazione che è noioso, se non soggetto a errori.

C'è un modo per renderlo parte di un tema o qualcosa del genere? È così che non devo associare questo stile a tutti EditText. Qualcosa di simile a questo blocco di codice fittizio:

<style name="App_Theme" parent="@android:style/Theme.Holo">
   ... 
   <item name="android:EditTextSyle">@style/App_EditTextStyle</item>
   ...
<style>

E poi nel mio AndroidManifest.xmlho qualcosa del tipo:

<application
    ....
    android:theme="@style/App_Theme">

E voilà! tutti i miei EditTexthanno lo stile coerente senza che io debba specificare lo stile per ogni istanza.

Risposte:


155

Sostituisci l'attributo che punta allo EditTextstile (denominato editTextStyle:)) nel tuo tema personalizzato:

<style name="App_Theme" parent="@android:style/Theme.Holo">
   <item name="android:editTextStyle">@style/App_EditTextStyle</item>
</style>

e fai in modo che il tuo stile personalizzato si estenda Widget.EditText:

<style name="App_EditTextStyle" parent="@android:style/Widget.EditText">
    <item name="android:background">@drawable/filled_roundededges_box_dark</item>
    <item name="android:textColor">#808080</item>
    <item name="android:layout_height">45dip</item>
</style>

Modificare:

Se stai utilizzando i temi relativi ad AppCompat molto più recenti, utilizza l'attributo editTextStyle senza il prefisso Android:

<style name="App_Theme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="editTextStyle">@style/App_EditTextStyle</item>
</style>

3
Sembra così plausibile e logico, eppure non sembra funzionare per me. Potrei perdere qualcosa?
Code Poet

1
@ManishGupta Come esattamente non funziona? Ho testato gli stili sopra e funzionano, MA layout_height/heightnon possono essere inseriti lì perché Android probabilmente controlla quegli attributi prima degli stili del tema e si lamenterà della loro mancanza. Ma un disegno personalizzato + un colore del testo diverso funziona con quanto sopra.
utente

Ho impostato le cose esattamente come descrivi. Non ha senso che ripubblichi. Te lo sto dando comunque. Mi manca qualcosa da qualche parte. Quello che prescrivi è logica fredda e dovrebbe funzionare. Lo rivedrò dopo essermi rinfrescato. Grazie.
Code Poet

3
@ toobsco42 edittextStylenon si applica a un AutoCompleTextView(sebbene sia un EditText). Dai un'occhiata autoCompleteTextViewStyleall'attributo nel theme.xml che punta a uno Widget.AutoCompleTextViewstile nel file style.xml.
utente

3
Non funziona anche per me. Ma se cambio <item name="android:editTextStyle">in <item name="editTextStyle">, va bene. Grazie!
Sam Sch

52

@Luksprog la risposta è corretta ma non funziona per me. Dopo alcuni esperimenti, ho scoperto che la rimozione dello spazio dei nomi Android da editTextStyle ha funzionato per me.

<style name="App_Theme" parent="@android:style/Theme.Holo">
   <item name="editTextStyle">@style/App_EditTextStyle</item>
</style>

e crea il tuo stile personalizzato per estenderlo Widget.EditTexto se usi il tema AppCompat Widget.AppCompat.EditText:

<style name="App_EditTextStyle" parent="@android:style/Widget.EditText">
    <item name="android:background">@drawable/filled_roundededges_box_dark</item>
    <item name="android:textColor">#808080</item>
    <item name="android:layout_height">45dip</item>
</style>

1
Funziona anche per me. Ma perché si comporta così?
Eagle_Eye

3
Potrebbe avere qualcosa a che fare con la AppCompatbiblioteca. La tua attività si estende AppCompatActivity? Oh i misteri dello sviluppo Android.
Matt Zukowski

1
@ MattZukowski ha scavato un po 'sulla base del tuo commento - probabile colpevole: da in AppCompat v7:21+poi gli attributi del tema standard devono essere usati senza il prefisso "android:" negli stili.
iflp

Grazie per questo.
Adam Varhegyi

Funziona bene anche senza usare Widget.AppCompat.EditText .. Ma non riesco ad accedere a Widget.AppCompat.EditText. Dice "Impossibile risolvere il simbolo" @android: style / Widget.AppCompat.EditText "
Neri

18

Per prima cosa, definisci lo stile per il tuo EditText. Assicurati che lo stile genitore siaandroid:Widget.EditText

<style name="CustomEditTextStyle" parent="android:Widget.EditText">

    <item name="android:textColor">#0F0F0F</item>
    <!-- ... More items here if needed ... -->
</style>

Successivamente, sovrascrivi l'attributo android:editTextStylenel tuo tema personalizzato. Tieni presente che se stai utilizzando la libreria di supporto, dovrai anche sovrascrivere l'attributo editTextStyle(senza lo spazio dei nomi Android).

<style name="App_Theme" parent="...">
   <item name="android:editTextStyle">@style/CustomEditTextStyle</item>
   <item name="editTextStyle">@style/CustomEditTextStyle</item> <!-- For compatibility with the support library -->
</style>

1

Se hai solo bisogno di impostare alcuni semplici parametri, come il colore del testo, lo spazio dei nomi Android ha alcuni parametri che lo faranno senza la necessità di dichiarare uno stile separato per il testo di modifica. Per esempio

<style name="MyStyle" parent="android:Theme.Material.NoActionBar">
    <item name="colorPrimary">@color/black</item>
    <item name="colorPrimaryDark">@color/white</item>
    <item name="colorAccent">@color/white</item>
    <item name="android:textColor">@color/black</item>
    <item name="android:editTextColor">@color/black</item>
    <item name="android:editTextBackground">@color/black</item>
    ....
</style>

Per la versione più recente di AppCompat usa editTextColore rimuovi android:.
Armin

-2
<style name="App_Theme" parent="@android:style/Theme.Holo">    
    <item name="android:editTextBackground">@drawable/filled_roundededges_box_dark</item>
</style>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.