Как установить поддержку библиотеки snackbar цвет текста на что-то другое, чем android:textColor?
поэтому я начал использовать новую Snackbar в библиотеке поддержки дизайна, но я обнаружил, что когда вы определяете "android:textColor" в своей теме, он применяется к цвету текста snackbar. Это, очевидно, проблема, если ваш основной цвет текста темный.
кто-нибудь знает способ обойти это или есть советы о том, как я должен покрасить свой текст?
редактировать январь 2017: (после ответа)
пока некоторые таможня решения для устранения проблемы ниже, это, вероятно, хорошо, чтобы обеспечить правильный путь к теме Snackbars.
во-первых, вы, вероятно, не следует определение 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 ответов
Я знаю, что на это уже ответили, но самый простой способ, который я нашел, был непосредственно в make, используя Html.fromHtml
способ и font
tag
Snackbar.make(view,
Html.fromHtml("<font color=\"#ffffff\">Tap to open</font>").show()
Я нашел это в каковы новые возможности библиотеки поддержки дизайна Android и как использовать ее Snackbar?
это сработало для меня для изменения цвета текста в 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();
хорошо, поэтому я исправил его, в основном реорганизовав то, как я делаю цвета текста.
в моей светлой теме, я поставил android:textColorPrimary
до normal dark text
Я хотел, и я поставил android:textColor
to 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
}
использование, как вы ожидаете:
закусочная.make (вид, Строки Р..your_string,закусочная.LENGTH_LONG).setTextColor(цвет.БЕЛЫЙ.)show ()
один подход заключается в использовании spans:
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();
С пядями вы также можете добавить несколько цветов и стилей внутри одного Snackbar. Вот хороший гид:
единственный способ, который я вижу, - это использовать 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
to
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();
}
}
}