Как установить поддержку библиотеки snackbar цвет текста на что-то другое, чем android:textColor?
Итак, я начал использовать новую Snackbar в библиотеке поддержки дизайна, но я обнаружил, что когда вы определяете "android:textColor" в своей теме, он применяется к цвету текста snackbar. Это, очевидно, проблема, если ваш основной цвет текста темный.
кто-нибудь знает способ обойти это или есть советы о том, как я должен раскрасить свой текст?
редактировать январь 2017: (пост-ответ)
пока есть некоторые обычаи решения для устранения проблемы ниже, это, вероятно, хорошо, чтобы обеспечить правильный путь к теме закусочных.
во-первых, вы, вероятно, не следует определение android:textColor
в ваших темах вообще (если вы действительно не знаете объем того, что использует тему). Это устанавливает цвет текста в основном каждого представления, которое подключается к вашей теме. Если вы хотите определить цвета текста в ваших представлениях, которые не являются стандартными, то используйте android:primaryTextColor
и ссылаться на этот атрибут в пользовательском просмотр.
однако, для применения темы к Snackbar
, пожалуйста, обратитесь к этому руководству по качеству от стороннего материала doc: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
макеты тоже, см. ссылку выше. Если этот способ кажется слишком замысловато, и вы хотите, конечно, надежный способ сделать пользовательские Snackbar последний через возможные обновления библиотеки поддержки).
и в качестве альтернативы, см. ответы ниже для аналогичных и, возможно, более быстрых ответов, чтобы решить вашу проблему.
14 ответов:
Я знаю, что на это уже ответили, но самый простой способ, который я нашел, был непосредственно в процессе использования
Html.fromHtml
способ иfont
tagSnackbar.make(view, Html.fromHtml("<font color=\"#ffffff\">Tap to open</font>").show()
Я нашел это в каковы новые возможности библиотеки поддержки дизайна Android и как использовать ее закусочную?
это работает для меня для изменения цвета текста в закусочной.
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();
хорошо, поэтому я исправил это, в основном реорганизовав способ, которым я делаю цвета текста.
в моей светлой теме, я поставил
android:textColorPrimary
доnormal dark text
Я хотел, и я поставилandroid:textColor
доwhite
.я обновил все мои текстовые представления и кнопки, чтобы иметь
android:textColor="?android:attr/textColorPrimary".
так потому что snackbar рисует от
textColor
, Я просто весь мой другой текстtextColorPrimary
.РЕДАКТИРОВАТЬ ЯНВАРЬ 2017: ----------------------------------------------------
так как комментарии говорят, и как указано в отредактированном исходном вопросе выше, вы, вероятно, не должны определять
android:textColor
в ваших темах, так как это изменяет цвет текста каждого представления внутри темы.
взлом на
android.support.design.R.id.snackbar_text
хрупкий, лучше или менее хакерский способ сделать это будет: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();
создал эту функцию расширения kotlin, которую я использую в своих проектах:
fun Snackbar.setTextColor(color: Int): Snackbar { val tv = view.findViewById(android.support.design.R.id.snackbar_text) as TextView tv.setTextColor(color) return this }
использование, как вы ожидаете:
закусочная.сделать(посмотреть, Р. стринг.your_string, Snackbar.LENGTH_LONG).setTextColor(цвет.БЕЛЫЙ.)показать()
один из подходов заключается в использовании пролетов:
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();
С пролетами вы также можете добавить несколько цветов и стилей внутри одной закусочной. Вот хороший гид:
единственный способ, который я вижу, это использовать
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();
это то, что я использую, когда мне нужны пользовательские цвета
@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();
Я сменил тему
Theme.AppCompat.Light.NoActionBar
до
Theme.AppCompat.NoActionBar
это сработало.Попробуйте использовать простую тему вместо света или другой темы.
вы можете использовать эту библиотеку: https://github.com/SandroMachado/restaurant
new Restaurant(MainActivity.this, "Snackbar with custom text color", Snackbar.LENGTH_LONG) .setTextColor(Color.GREEN) .show();
отказ от ответственности: я сделал библиотеки.
У меня есть простой код, который поможет получить экземпляр как textview Snackbar, после чего вы можете вызвать все методы, которые применимы к textview.
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));
просто чтобы сэкономить ваше драгоценное время разработки, вот статический метод, который я использую:
public static void snack(View view, String message) { if (!TextUtils.isEmpty(message)) { Snackbar snackbar = Snackbar.make(view, message, Snackbar.LENGTH_SHORT); snackbar.getView().setBackgroundColor(Color.YELLOW); TextView tv = snackbar.getView().findViewById(android.support.design.R.id.snackbar_text); //snackbar_text tv.setTextColor(Color.BLACK); snackbar.show(); } }
вот как это выглядит:
Если вы находитесь в Котлин, вы можете создать расширение :
fun Snackbar.withTextColor(color: Int): Snackbar { val tv = this.view.findViewById(android.support.design.R.id.snackbar_text) as TextView tv.setTextColor(color) return this }
использование:
yourSnackBar.withTextColor(Color.WHITE).show()
Я также заметил ту же проблему. Благодаря ответам здесь я создал небольшой класс, который может помочь решить эту проблему более легко, просто заменив это:
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(); } }
}
Comments