61

Итак, я начал использовать новую Snackbar в библиотеке поддержки дизайна, но обнаружил, что когда вы определяете «андроид: textColor» в своей теме, это относится к цвету текста закутки. Это, очевидно, проблема, если ваш основной цвет текста темный.Как установить цвет текста библиотеки закуски для библиотеки, отличной от android: textColor?

enter image description here

Кто-нибудь знает способ обойти это или есть советы о том, как я должен покрасить мой текст?

EDIT января 2017: (Post-ответ)

Хотя есть некоторые пользовательские решения, чтобы исправить эту проблему ниже, это, вероятно, хорошо, чтобы обеспечить правильный путь к теме закусочные.

Во-первых, вы, вероятно, не должны определять android:textColor в своих темах вообще (если только вы не знаете масштаб того, что использует тему). Это устанавливает цвет текста в основном для каждого вида, который соединяется с вашей темой. Если вы хотите определить цвета текста в своих представлениях, которые не являются стандартными, используйте android:primaryTextColor и укажите этот атрибут в своих пользовательских представлениях.

Однако для применения темы к Snackbar, пожалуйста, ссылка на этот качественный гид из материала третьей стороной документа: http://www.materialdoc.com/snackbar/ (Следуйте программную реализацию темы, чтобы не полагаться на стиле XML)

Для справки:

// 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); 

(вы также можете создать свой собственный Snackbar макетов тоже увидеть ссылку выше. Сделайте так, если этот метод кажется слишком Hacky, и вы хотите, безусловно, надежный способ иметь свой обычай закусочная последние через возможные обновления библиотеки поддержки).

И, альтернативно, см. Ответы ниже для получения похожих и, возможно, более быстрых ответов для решения вашей проблемы.

ответ

22

Я знаю, что это был дан ответ уже, но самый простой способ я нашел прямо в марке, используя в HTML.fromHTML и с помощью тега шрифта

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

Я предпочитаю это решение, так как это одна строка. –

+0

Это не реальное решение этого вопроса. Использование: snackbar.setActionTextColor (Color.WHITE) .show(); –

+0

В настройке «Закусочная» была/была ошибка, цвет ничего не сделал. Этот способ работает независимо от того, но не может быть оптимальным решением для других. – JPM

5

Единственный способ, которым я вижу, - использовать getView() и ездить на велосипеде по его ребенку. Я не знаю, будет ли это работать, и это плохо, как кажется. Надеюсь, в ближайшее время они добавят API.

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(); 
11

Хорошо, поэтому я исправил его, в основном, реорганизовывая способ ввода текста.

В моей легкой теме я установил android:textColorPrimary на normal dark text Я хотел, и я установил android:textColor в white.

я обновил все мои текстовые взгляды и кнопок, чтобы иметь android:textColor="?android:attr/textColorPrimary".

Итак, потому что закусочная черпает из textColor, я просто установить все мой другой текст в textColorPrimary.

EDIT ЯНВАРЬ 2017: ----------------------------------------- -----------

Как говорится в комментариях, и как указано в отредактированном исходном вопросе выше, вы, вероятно, не должны определять android:textColor в своих темах, так как это изменяет цвет текста каждого вид внутри темы.

+0

Я только что завершил эту задачу, племя, потребовалось некоторое время! Тем не менее, мне нужно было использовать метод «m vai» ниже для моей устаревшей деятельности Preferences (с использованием preferences.xml). Я думаю, что это оставило мой стиль приложения гораздо более корректным, потому что это хорошо. +1 – OceanLife

+1

Нехорошее решение IMO, я хочу сохранить свою актуальную тему для textview и просто изменить цвет текста snakbar ... – issamux

+1

Вы не должны определять 'android: textColor' в своей теме вообще. Это * стиль * атрибут 'TextView'. Если вы определяете его в своей * теме *, вы переопределяете цвет текста каждого 'TextView' или' Button', который не указывает его цвет текста в XML. Это также является сообщением с закусочной, которое обычно принимает цвет из темного * наложения темы *. –

121

Я нашел это в What are the new features of Android Design Support Library and how to use its 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(); 
+0

На всякий случай кто-то тщетно ищет способ изменить размер текста закуски, вот и все! –

+0

snack.getView()? что такое закусочный объект? – angel

+0

Я считаю, что у меня есть полный код. Посмотрите контекст rootView = ((Activity)) .getWindow(). GetDecorView(). FindViewById (android.R.id.content); Snackbar mysnack = Snackbar.make (rootView, Mensaje, Snackbar.LENGTH_LONG); View view = mysnack.getView(); TextView tv = (TextView) view.findViewById (android.support.design.R.id.snackbar_text); tv.setTextColor (Color.WHITE); mysnack.show(); – angel

2

Я изменил мою тему

Theme.AppCompat.Light.NoActionBar 

в

Theme.AppCompat.NoActionBar 

Он worked.Try использовать простую тему вместо света или другую тему.

6

Один подход заключается в использовании пролеты:

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(); 

с пролетами вы также можете добавить несколько цветов и стилей внутри одной закусочной. Вот хороший гид:

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

1

Вы можете использовать эту библиотеку: https://github.com/SandroMachado/restaurant

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

Отказ: Я сделал библиотеку.

2

Это то, что я использую, когда мне нужно пользовательские цвета

@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; 
    } 

И потребляются как:

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

Я также заметил ту же проблему. Благодаря ответам здесь я создал небольшой класс, который может помочь решить эту проблему в более легко, просто путем замены:

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

с этим:

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

Вот мой класс :

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(); 
    } 
} 

}

+1

Это взломать и полагается на идентификаторы различных видов библиотеки поддержки, которые статичны. Я бы избегал этого решения любой ценой. – DiscDev

9

Взлом на android.support.design.R.id.snackbar_text хрупок, лучше или ле сс Hacky способ сделать это будет:

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(); 
+1

любил человека, спасибо: D –

0

У меня есть простой код, который поможет получить экземпляр как текстового представления Snackbar, после чего вы можете вызвать все методы, которые применимы к текстовому виду.

Snackbar snackbar = Snackbar.make(...) // Create Snack bar 


snackbar.setActionTextColor(getResources().getColor(R.color.white)); //if you directly want to apply the color to Action Text 

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

snackbarActionTextView.setTextColor(Color.RED); //This is another way of doing it 

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

//Below Code is to modify the Text in Snack bar 
TextView snackbarTextView = (TextView) snackbar.getView().findViewById(android.support.design.R.id.snackbar_text); 
snackbarTextView.setTextSize(16); 
snackbarTextView.setTextColor(getResources().getColor(R.color.white)); 
0
Snackbar.make(getView(), "Hello", Snackbar.LENGTH_SHORT) 
    .setActionTextColor(Color.WHITE) 
    .show(); 
+0

Это просто установка цвета ActionText, а не текста сообщения – Richard

3

создал эту функцию Котлин я использую продление в моих проектах:

fun Snackbar.setTextColor(color: Int): Snackbar { 
    val tv = view.findViewById(android.support.design.R.id.snackbar_text) as TextView 
    tv.setTextColor(color) 

    return this 
} 

Использование как можно было бы ожидать:

Snackbar.make (вид, R .string.your_string, Snackbar.LENGTH_LONG) .setTextColor (Color.WHITE) .show()

+0

Любовь к простому использованию методов расширения Kotlin! ;-) –

Смежные вопросы