Establecer un estilo coherente para todos los EditText (por ejemplo)

84

Estoy tratando de que todos EditTextlos elementos de mi aplicación tengan un aspecto coherente. Soy consciente de que puedo hacer algo como esto:

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

Entonces puedo hacer que un particular EditTexttenga este estilo haciendo esto:

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

Pero de esta manera tengo que recordar establecer el estilo individualmente para todos y cada uno EditText en mi aplicación, lo cual es tedioso, si no propenso a errores.

¿Hay alguna forma de que pueda hacer que esto sea parte de un tema o algo así? Esto es para que no tenga que asociar este estilo a todos EditText. Algo como este bloque de código ficticio:

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

Y luego en mi AndroidManifest.xmltengo algo como:

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

¡Y voilá! todos mis EditTexttienen el estilo consistente sin que yo tenga que especificar el estilo para cada instancia.

Poeta del código
fuente

Respuestas:

155

Anule el atributo que apunta al EditTextestilo (llamado editTextStyle:)) en su tema personalizado:

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

y haz tu estilo personalizado para extender 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>

Editar:

Si está utilizando los temas relacionados con AppCompat mucho más nuevos, use el atributo editTextStyle sin el prefijo de Android:

<style name="App_Theme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="editTextStyle">@style/App_EditTextStyle</item>
</style>
usuario
fuente
3
Esto suena tan plausible y lógico, pero no parece funcionar para mí. ¿Podría estar perdiendo algo?
Code Poet
1
@ManishGupta ¿Cómo no funciona exactamente? Probé los estilos anteriores y funcionan, PERO layout_height/heightno se pueden poner allí porque Android probablemente verifica esos atributos antes que los estilos del tema y se quejará de que faltan. Pero un dibujo personalizado + un color de texto diferente funciona con lo anterior.
usuario
Tengo las cosas configuradas exactamente como lo describe. No tiene sentido que vuelva a publicar. Te estoy dando esto de todos modos. Me falta algo en alguna parte. Lo que prescribe es lógica fría y debería funcionar. Revisaré esto después de refrescarme. Gracias.
Code Poet
3
@ toobsco42 edittextStyleno se aplica a un AutoCompleTextView(aunque es un EditText). Eche un vistazo al autoCompleteTextViewStyleatributo en theme.xml que apunta a un Widget.AutoCompleTextViewestilo en el archivo style.xml.
usuario
3
No funciona para mí también. Pero si cambio <item name="android:editTextStyle">a <item name="editTextStyle">, está bien. ¡Gracias!
Sam Sch
52

La respuesta de @Luksprog es correcta pero no funciona para mí. Después de un poco de experimentación, descubrí que eliminar el espacio de nombres de Android de editTextStyle lo hizo funcionar para mí.

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

y haga su estilo personalizado para extender Widget.EditTexto si usa el 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>
iflp
fuente
1
Funciona para mí también. Pero, ¿por qué se comporta así?
Eagle_Eye
3
Podría tener algo que ver con la AppCompatbiblioteca. ¿Tu actividad se extiende AppCompatActivity? Oh, los misterios del desarrollo de Android.
Matt Zukowski
1
@MattZukowski investigó un poco sobre la base de su comentario - culpable probable: a partir de ahora AppCompat v7:21+, los atributos estándar del tema deben usarse sin el prefijo "android:" en los estilos.
iflp
Gracias por esto.
Adam Varhegyi
Funciona bien incluso sin usar Widget.AppCompat.EditText .. Pero no puedo acceder a Widget.AppCompat.EditText. Dice "no se puede resolver el símbolo '@android: style / Widget.AppCompat.EditText'"
Neri
18

Primero, defina el estilo para su EditText. Asegúrese de que el estilo principal seaandroid:Widget.EditText

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

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

Después de eso, anule el atributo android:editTextStyleen su tema personalizado. Tenga en cuenta que si está utilizando la biblioteca de soporte, también deberá anular el atributo editTextStyle(sin el espacio de nombres de 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>
Reynaldo Aguilar
fuente
1

Si solo necesita establecer algunos parámetros simples, como el color del texto, el espacio de nombres de Android tiene algunos parámetros que lo harán sin la necesidad de declarar un estilo separado para el texto de edición. P.ej

<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>
Phil Blandford
fuente
Para una versión más reciente de AppCompat, use editTextColory elimine android:.
Armin
-2
<style name="App_Theme" parent="@android:style/Theme.Holo">    
    <item name="android:editTextBackground">@drawable/filled_roundededges_box_dark</item>
</style>
usuario1700099
fuente