Как установить поддержку библиотеки snackbar цвет текста на что-то другое, чем android:textColor?



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



enter image description here



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



редактировать январь 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 последний через возможные обновления библиотеки поддержки).



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

390   14  

14 ответов:

Я знаю, что на это уже ответили, но самый простой способ, который я нашел, был непосредственно в процессе использования Html.fromHtml способ и font tag

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

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

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

единственный способ, который я вижу, это использовать 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();
    }
}

вот как это выглядит:

yellow snackbar with black text

Если вы находитесь в Котлин, вы можете создать расширение :

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

    Ничего не найдено.