Estoy usando appcompat v7 para obtener un aspecto consistente en Android 5 y menos. Funciona bastante bien. Sin embargo, no puedo entender cómo cambiar el color de la línea de fondo y el color de acento para EditTexts. ¿Es posible?
Intenté definir una costumbre android:editTextStyle
(ver abajo) pero solo logré cambiar el color de fondo completo o el color del texto, pero no la línea de fondo ni el color de acento. ¿Hay un valor de propiedad específico para usar? ¿Tengo que usar una imagen dibujable personalizada a través de la android:background
propiedad? ¿No es posible especificar un color en hexa?
<style name="Theme.App.Base" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:editTextStyle">@style/Widget.App.EditText</item>
</style>
<style name="Widget.App.EditText" parent="Widget.AppCompat.EditText">
???
</style>
Según las fuentes de Android API 21, EditTexts con diseño de material parece usar colorControlActivated
y colorControlNormal
. Por lo tanto, he intentado anular estas propiedades en la definición de estilo anterior, pero no tiene ningún efecto. Probablemente appcompat no lo use. Desafortunadamente, no puedo encontrar las fuentes para la última versión de appcompat con diseño de material.
AppCompatEditText
, aparentemente.Respuestas:
Finalmente, he encontrado una solución. Consiste simplemente en sustituir el valor de
colorControlActivated
,colorControlHighlight
ycolorControlNormal
en la definición del tema de aplicación y no su estilo EditarTexto. Luego, piense en usar este tema para cualquier actividad que desee. A continuación se muestra un ejemplo:fuente
android:theme="@style/Theme.App.Base
. Esto asegurará que el estilo no afectará otras vistas en sus diseños que no desea cambiar.AppCompatActivity
. No funcionará si hereda deActivity
.Sentí que esto necesitaba una respuesta en caso de que alguien quisiera cambiar un solo texto de edición. Lo hago así:
fuente
Mientras que la solución Laurents es correcta, viene con algunos inconvenientes que se han descrito en los comentarios ya que no sólo la línea inferior de la
EditText
consigue teñido pero el botón de retorno de laToolbar
,CheckBoxes
etc., así.Por suerte
v22.1
deappcompat-v7
introdujo algunas nuevas posibilidades. Ahora es posible asignar un tema específico solo a una vista. Directamente desde el registro de cambios :Entonces, en lugar de establecer el color deseado en un tema global, creamos uno nuevo y lo asignamos solo a
EditText
.Ejemplo:
fuente
colorControlNormal
sin el prefijo de Android utiliza el método appcompat para teñir widgets, mientras que con el prefijo recurre al método del sistema y esto solo está disponible en dispositivos API 21+.22.2.0
versión de AppCompat pero este truco no funciona :(Esto se puede cambiar en XML usando:
Para la API de referencia> = 21, use la compatibilidad:
Para el uso de compatibilidad con API <21 anterior:
fuente
backgroundTint="@color/blue"
lugar deandroid:backgroundTint="@color/blue"
soporte compatible con versiones anterioresandroid:backgroundTint="@color/blue"
, usarapp:backgroundTint="@color/blue"
para admitir dispositivos pre-Lollipop, ¡gracias por tu comentario!tools:ignore="MissingPrefix"
siapp:backgroundTint="<your color>"
Aquí está la solución para API <21 y superior
Espero que ayude
fuente
24.2.1
,25.1.1
,25.2.0
para el dispositivo <21 y> 21 y se sigue trabajando. Consulte esta demostración simple drive.google.com/file/d/0B_poNaia6t8kSzU3bDFVazRSSDA/… . No sé por qué este código no funciona para usted, así que hágamelo saber. graciasLa respuesta aceptada es un poco más por estilo, pero lo más eficiente es agregar el atributo colorAccent en su estilo AppTheme de esta manera:
El atributo colorAccent se usa para el tinte de widgets en toda la aplicación y, por lo tanto, debe usarse para mantener la coherencia.
fuente
name="android:colorAccent"
errorSi está usando
appcompat-v7:22.1.0+
, puede usar DrawableCompat para teñir sus widgetsfuente
Utilizar:
Esto admitirá dispositivos pre-Lollipop no solo +21
fuente
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
y debería funcionarfuente
Una solución rápida para su problema es buscar en su paquete / build / intermedios / exploded-aar / com.android.support / appcompat-v7 / res / drawable / for abc_edit_text_material.xml y copiar ese archivo xml en su carpeta dibujable. Luego puede cambiar el color de los 9 archivos de parche desde este selector, para que coincida con sus preferencias.
fuente
Es muy fácil simplemente agregar
android:backgroundTint
atributo en suEditText
.fuente
app:backgroundTint="@color/blue"
funciona en todos los niveles de la API ... aunque, por cualquier motivo, sigue cambiando a un color diferente cuando se selecciona XDAquí hay una parte del código fuente de la
TextInputLayout
biblioteca de diseño de soporte ( ACTUALIZADO para la versión 23.2.0 ), que cambiaEditText
el color de la línea de fondo de una manera más simple:Parece que todo el código anterior se vuelve inútil en este momento en 23.2.0 si desea cambiar el color mediante programación.
Y si quieres soportar todas las plataformas, aquí está mi método:
fuente
Yo también estuve atrapado en este problema durante demasiado tiempo.
Necesitaba una solución que funcionara para las versiones anteriores y posteriores a v21.
Finalmente descubrí una solución muy simple, quizás no ideal pero efectiva: simplemente configure el color de fondo
transparent
en las propiedades EditText.Espero que esto ahorre algo de tiempo.
fuente
Para mí, modifiqué el AppTheme y un valor colors.xml Tanto el colorControlNormal como el colorAccent me ayudaron a cambiar el color del borde EditText. Así como el cursor y el "|" cuando dentro de un EditText.
Aquí está el colors.xml
Saqué el atributo android: textCursorDrawable a @null que coloqué dentro del estilo editText. Cuando intenté usar esto, los colores no cambiaron.
fuente
Puede configurar el fondo del texto de edición en un rectángulo con relleno menos a la izquierda, derecha y arriba para lograr esto. Aquí está el ejemplo xml:
Reemplace la forma con un selector si desea proporcionar un ancho y un color diferentes para el texto de edición enfocado.
fuente
En Activit.XML agregue el código
Donde
BackgroundTint=color
para su color deseadofuente
Utilizo este método para cambiar el color de la línea con PorterDuff, sin otro dibujable.
fuente
Si desea cambiar el resultado final sin usar los colores de la aplicación, use estas líneas en su tema:
No conozco otra solución.
fuente
Desarrollé una solución funcional para este problema después de 2 días de lucha, la solución a continuación es perfecta para aquellos que desean cambiar solo algunos textos de edición, cambiar / alternar el color a través del código de Java y quieren superar los problemas de comportamiento diferente en las versiones del sistema operativo debido al uso del método setColorFilter ().
Usos en xml
Agregar líneas con estilo
código java para alternar color
fuente
Estaba absolutamente desconcertado por este problema. Había intentado todo en este hilo y en otros, pero no importa lo que hice, no pude cambiar el color del subrayado a otro que no sea el azul predeterminado.
Finalmente descubrí lo que estaba pasando. Estaba usando (incorrectamente)
android.widget.EditText
al hacer una nueva instancia (pero el resto de mis componentes eran de la biblioteca appcompat). Debería haberlo usadoandroid.support.v7.widget.AppCompatEditText
. He sustituidonew EditText(this)
connew AppCompatEditText(this)
y el problema se solucionó al instante. Resulta que, si realmente está usandoAppCompatEditText
, solo respetará elaccentColor
tema (como se menciona en varios comentarios anteriores) y no es necesaria una configuración adicional.fuente
Este es el más fácil y más eficiente / reutilizable / funciona en todas las API
Cree una clase personalizada de EditText de esta manera:
Entonces úsalo así:
fuente
Para cambiar el fondo EditText dinámicamente, puede usar ColorStateList .
Créditos: Esta respuesta SO sobre ColorStateList es increíble .
fuente
Agregue
app:backgroundTint
por debajo del nivel de API 21. De lo contrario, useandroid:backgroundTint
.Por debajo del nivel 21 de la API.
Para niveles superiores al nivel 21 de la API.
fuente
Modifique este método según sus necesidades. ¡Esto funcionó para mí!
fuente