Cómo configurar el color de texto de la barra de ayuda de la biblioteca de soporte a algo que no sea android: textColor?

Así que empecé a usar la nueva Snackbar en la Biblioteca de Diseño, pero encontré que cuando defines "android: textColor" en tu tema, se aplica al color de texto de la barra de menús. Esto obviamente es un problema si el color del texto principal es oscuro.

Introduzca aquí la descripción de la imagen

¿Alguien sabe una manera alrededor de esto o tener consejo para cómo debo colorear mi texto?

EDITAR Enero 2017: (Post-respuesta)

Si bien hay algunas soluciones personalizadas para solucionar el problema a continuación, es probablemente bueno proporcionar la forma correcta de Snackbars tema.

En primer lugar, probablemente no debería definirse android:textColor en todos sus temas (a menos que realmente sepa el alcance de lo que está utilizando el tema). Esto establece el color de texto de, básicamente, todas las vistas que se conecta a su tema. Si desea definir colores de texto en sus vistas que no sean predeterminadas, utilice android:primaryTextColor y android:primaryTextColor referencia a ese atributo en sus vistas personalizadas.

Sin embargo, para aplicar temas a Snackbar , por favor haga referencia a 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 diseños de Snackbar personalizados, vea el enlace anterior. Si este método se siente demasiado hacky y desea una manera segura de tener su Snackbar personalizado pasado 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.

Sé que esto ya se ha contestado, pero la forma más fácil que encontré fue directo en la marca utilizando HTML.fromHTML y utilizando una etiqueta de fuente

 Snackbar.make(view, Html.fromHtml("<font color=\"#ffffff\">Tap to open</font>").show() 

Encontré esto en ¿Cuáles son las nuevas características de Android Design Support Library y cómo usar su Snackbar?

Esto funcionó para mí para cambiar el color del texto en un Snackbar.

 Snackbar snack = Snackbar.make(view, R.string.message, Snackbar.LENGTH_LONG); View view = snack.getView(); TextView tv = (TextView) view.findViewById(android.support.design.R.id.snackbar_text); tv.setTextColor(Color.WHITE); snack.show(); 

Muy bien así que lo arreglé básicamente reorganizando la forma en que hago los colores de texto.

En mi tema de la luz, android:textColorPrimary al normal dark text que deseé, y android:textColor al white .

He actualizado todas mis vistas de texto y los botones para tener android:textColor="?android:attr/textColorPrimary".

Así que porque snackbar dibuja de textColor , acabo de fijar todo mi otro texto a textColorPrimary .

EDITAR ENERO DE 2017: ———————————————- ——

Así 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 de texto de cada vista dentro del tema.

Hacking en android.support.design.R.id.snackbar_text es frágil, una forma mejor o menos hacky de hacerlo será:

 String snackText = getResources().getString(YOUR_RESOURCE_ID); SpannableStringBuilder ssb = new SpannableStringBuilder() .append(snackText); ssb.setSpan( new ForegroundColorSpan(Color.WHITE), 0, snackText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); Snackbar.make( getView(), ssb, Snackbar.LENGTH_SHORT) .show(); 

Un enfoque consiste en utilizar tramos:

 final ForegroundColorSpan whiteSpan = new ForegroundColorSpan(ContextCompat.getColor(this, android.R.color.white)); SpannableStringBuilder snackbarText = new SpannableStringBuilder("Hello, I'm white!"); snackbarText.setSpan(whiteSpan, 0, snackbarText.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); Snackbar.make(view, snackbarText, Snackbar.LENGTH_LONG) .show(); 

Con vanos también puede agregar varios colores y estilos dentro de una Snackbar. Aquí hay una buena guía:

https://androidbycode.wordpress.com/2015/06/06/material-design-snackbar-using-the-design-support-library/

La única manera que veo es usando getView() y el ciclismo a través de su hijo. No sé si va a funcionar, y es malo como parece. Espero que agreguen algo de API sobre este problema pronto.

 Snackbar snack = Snackbar.make(...); ViewGroup group = (ViewGroup) snack.getView(); for (int i = 0; i < group.getChildCount(); i++) { View v = group.getChildAt(i); if (v instanceof TextView) { TextView t = (TextView) v; t.setTextColor(...) } } snack.show(); 

Esto es lo que uso cuando necesito colores personalizados

  @NonNull public static Snackbar makeSnackbar(@NonNull View layout, @NonNull CharSequence text, int duration, int backgroundColor, int textColor/*, int actionTextColor*/){ Snackbar snackBarView = Snackbar.make(layout, text, duration); snackBarView.getView().setBackgroundColor(backgroundColor); //snackBarView.setActionTextColor(actionTextColor); TextView tv = (TextView) snackBarView.getView().findViewById(android.support.design.R.id.snackbar_text); tv.setTextColor(textColor); return snackBarView; } 

Y consumido como:

 CustomView.makeSnackbar(view, "Hello", Snackbar.LENGTH_LONG, Color.YELLOW,Color.CYAN).setAction("DO IT", myAction).show(); 

Cambié mi tema

Theme.AppCompat.Light.NoActionBar

a

Theme.AppCompat.NoActionBar

Funcionó. Intente utilizar el tema simple en vez de la luz u otro tema.

Puede utilizar esta biblioteca: https://github.com/SandroMachado/restaurant

 new Restaurant(MainActivity.this, "Snackbar with custom text color", Snackbar.LENGTH_LONG) .setTextColor(Color.GREEN) .show(); 

Renuncia: Hice la biblioteca.

Tengo un código simple que ayudará a obtener una instancia de la vista de texto de Snackbar, después de que usted puede llamar a todos los métodos que son aplicables en un textview.

Snackbar snackbar = Snackbar.make (…) // Crear Snack bar

Snackbar.setActionTextColor (getResources (). GetColor (R.color.white)); // si desea directamente aplicar el color al texto de acción

TextView snackbarActionTextView = (TextView) snackbar.getView (). FindViewById (android.support.design.R.id.snackbar_action);

SnackbarActionTextView.setTextColor (Color.RED); // Esta es otra forma de hacerlo

SnackbarActionTextView.setTypeface (snackbarActionTextView.getTypeface (), Typeface.BOLD);

// Debajo del código es modificar el texto en la barra de Snack TextView snackbarTextView = (TextView) snackbar.getView (). FindViewById (android.support.design.R.id.snackbar_text); SnackbarTextView.setTextSize (16); SnackbarTextView.setTextColor (getResources (). GetColor (R.color.white));

Snackbar.make (translationRecycler, R.string.error_getting_translation_list, Snackbar.LENGTH_SHORT) .setActionTextColor (Color.WHITE) .show ();

También noté el mismo problema. Gracias a las respuestas aquí he creado una clase pequeña, que puede ayudar a resolver este problema con más facilidad, simplemente reemplazando esto:

 Snackbar.make(view, "Error", Snackbar.LENGTH_LONG).show(); 

con este:

 Snackbar2.make(view, "Error", Snackbar.LENGTH_LONG).show(); 

Aquí está mi clase:

 public class Snackbar2 { static public Snackbar make(View view, int resid, int duration){ Snackbar result = Snackbar.make(view, resid, duration); process(result); return result; } static public Snackbar make(View view, String text, int duration){ Snackbar result = Snackbar.make(view, text, duration); process(result); return result; } static private void process(Snackbar snackbar){ try { View view1= snackbar.getView(); TextView tv = (TextView) view1.findViewById(android.support.design.R.id.snackbar_text); tv.setTextColor(Color.WHITE); }catch (Exception ex) { //inform about error ex.printStackTrace(); } } 

}

  • ¿Es una buena práctica incluir todos los diseños en CoordinatorLayout?
  • Envolver la altura del contenido en un SnackBar
  • Acción Snackbar getView ()
  • En una acción de snackbar, ¿cómo puedo asegurarme de que es seguro borrar de forma permanente un registro borrado por software de la base de datos?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.