Así que comencé a usar la nueva Snackbar en la Biblioteca de soporte de diseño, pero descubrí que cuando define "android: textColor" en su tema, se aplica al color del texto de la snackbar. Obviamente, esto es un problema si el color de su texto principal es oscuro.
¿Alguien sabe cómo evitar esto o tiene algún consejo sobre cómo debo colorear mi texto?
EDITAR enero de 2017: (Post-respuesta)
Si bien existen algunas soluciones personalizadas para solucionar el problema a continuación, probablemente sea bueno proporcionar la forma correcta de tema Snackbars.
En primer lugar, probablemente no debería definir android:textColor
sus temas en absoluto (a menos que realmente sepa el alcance de lo que está usando el tema). Esto establece el color del texto de básicamente todas las vistas que se conectan a su tema. Si desea definir colores de texto en sus vistas que no sean los predeterminados, utilice android:primaryTextColor
y haga referencia a ese atributo en sus vistas personalizadas.
Sin embargo, para aplicar temas a Snackbar
, consulte esta guía de calidad de un documento de material de terceros: http://www.materialdoc.com/snackbar/ (Siga la implementación del tema programático para que no dependa de un estilo xml)
Para referencia:
// create instance
Snackbar snackbar = Snackbar.make(view, text, duration);
// set action button color
snackbar.setActionTextColor(getResources().getColor(R.color.indigo));
// get snackbar view
View snackbarView = snackbar.getView();
// change snackbar text color
int snackbarTextId = android.support.design.R.id.snackbar_text;
TextView textView = (TextView)snackbarView.findViewById(snackbarTextId);
textView.setTextColor(getResources().getColor(R.color.indigo));
// change snackbar background
snackbarView.setBackgroundColor(Color.MAGENTA);
(También puede crear sus propios Snackbar
diseños personalizados , consulte el enlace anterior. Hágalo si este método se siente demasiado engañoso y desea una forma segura y confiable de tener su Snackbar personalizado al final a través de posibles actualizaciones de la biblioteca de soporte).
Y, alternativamente, vea las respuestas a continuación para obtener respuestas similares y quizás más rápidas para resolver su problema.
android:textColorPrimary
Respuestas:
Sé que esto ya ha sido respondido, pero la forma más fácil que encontré fue directamente en la marca usando el
Html.fromHtml
método y unafont
etiquetafuente
Encontré esto en ¿Cuáles son las nuevas características de la Biblioteca de compatibilidad de diseño de Android y cómo usar su Snackbar?
Esto funcionó para mí para cambiar el color del texto en un Snackbar.
ACTUALIZACIÓN: ANDROIDX: como señala dblackker en los comentarios, con la nueva biblioteca de soporte de AndroidX, el código para encontrar el ID de Snackbar TextView cambia a:
fuente
snackbar_action
lugar desnackbar_text
. Vea esta respuesta para ver un ejemplo: stackoverflow.com/a/36800101/293280snack.view.findViewById(com.google.android.material.R.id.snackbar_text) as TextView
Hackear
android.support.design.R.id.snackbar_text
es frágil, una forma mejor o menos hack de hacerlo será:fuente
Creé esta función de extensión de kotlin que uso en mis proyectos:
Uso como es de esperar:
fuente
com.google.android.material.R.id.snackbar_text
si migra a AndroidX.Muy bien, lo arreglé básicamente reorganizando la forma en que hago los colores del texto.
En mi tema de la luz, me puse
android:textColorPrimary
a lanormal dark text
que quería, y me puseandroid:textColor
awhite
.Actualicé todas mis vistas de texto y botones para tener
android:textColor="?android:attr/textColorPrimary".
Entonces, debido a que la barra de bocadillos se basa en
textColor
, configuré todo el resto de mi texto entextColorPrimary
.EDITAR ENERO DE 2017: ---------------------------------------------- ------
Entonces, como dicen los comentarios, y como se indica en la pregunta original editada anterior, probablemente no debería definir
android:textColor
en sus temas, ya que esto cambia el color del texto de cada vista dentro del tema.fuente
android:textColor
tu tema en absoluto. Es un atributo de estilo deTextView
. Si lo define en su tema , anula el color del texto de cadaTextView
o elButton
que no especifica su color de texto en XML. Ese también es el mensaje de la cafetería que normalmente tomaría color de su superposición de tema oscuro .Un enfoque es usar tramos:
Con los tramos, también puede agregar varios colores y estilos dentro de una Snackbar. Aquí tienes una buena guía:
https://androidbycode.wordpress.com/2015/06/06/material-design-snackbar-using-the-design-support-library/
fuente
Si ha migrado a androidX, utilice en
com.google.android.material.R.id.snackbar_text
lugar deandroid.support.design.R.id.snackbar_text
cambiar el color del texto en la barra de aperitivos.fuente
La única forma que veo es usando
getView()
y ciclando a través de su hijo. No sé si va a funcionar, y es tan malo como parece. Espero que pronto agreguen alguna API sobre este problema.fuente
Si va a migrar su código a AndroidX, la propiedad TextView ahora es:
fuente
Esto es lo que uso cuando necesito colores personalizados.
Y consumido como:
fuente
Cambié mi tema
a
Funcionó Intente usar un tema simple en lugar de un tema ligero u otro.
fuente
Si decide utilizar la solución sucia y pirateada con la búsqueda de TextView en Snackbar por id y ya ha migrado a androidx, aquí está el código:
fuente
Puede utilizar esta biblioteca: https://github.com/SandroMachado/restaurant
Descargo de responsabilidad: hice la biblioteca.
fuente
Find by id no funcionó para mí, así que encontré otra solución:
fuente
Utilice el
Snackbar
incluido en la biblioteca de componentes de materiales y aplique elsetTextColor
para definir el color del textosetActionTextColor
para definir el color del texto utilizado por la acción. Puede utilizar un color o un selector de colorsetBackgroundTint
para definir el color de fondo de la SnackbarAlgo como:
fuente
Tengo un código simple que ayudará a obtener una instancia de la vista de texto de Snackbar, después de eso, puede llamar a todos los métodos que son aplicables en una vista de texto.
fuente
Solo para ahorrar su valioso tiempo de desarrollo, aquí está el método estático que estoy usando:
Así es como se ve:
fuente
Si está en Kotlin , puede crear una extensión:
Uso :
fuente
Según los nuevos componentes de AndroidX Jitpack
Use esta extensión que había creado
Úselo así
fuente
Esta es mi solución para resolver este tipo de problema al
androidx
usarkotlin
Necesita inicializar el método
mContent
internoonViewCreated
como a continuaciónfuente
Actualmente (enero de 2020) con
com.google.android.material:material:1.2.0
y probablemente también1.1.0
Definitivamente es la mejor manera de hacerlo anulando estos estilos:
Si usa un tema material con
.Bridge
al final, por alguna razón, ninguno de estos estilos está definido. Entonces, Snackar usará algunos diseños heredados sin estos estilos.Encontré en el código fuente que ambos
snackbarButtonStyle
ysnackbarTextViewStyle
deben definirse, de lo contrario, no se usará.fuente
También noté el mismo problema. Gracias a las respuestas aquí, he creado una clase pequeña, que puede ayudar a resolver este problema más fácilmente, simplemente reemplazando esto:
con este:
Aquí está mi clase:
}
fuente