web-dev-qa-db-ja.com

サポートライブラリのスナックバーのテキストの色をAndroid:textColor以外に設定するにはどうすればよいですか?

そのため、デザインサポートライブラリで新しいスナックバーの使用を開始しましたが、テーマで「Android:textColor」を定義すると、スナックバーのテキストの色に適用されることがわかりました。プライマリテキストの色が暗い場合、これは明らかに問題です。

enter image description here

誰かがこれを回避する方法を知っていますか、テキストをどのように色付けするべきかについてのアドバイスがありますか?

2017年1月編集:(回答後)

以下の問題を解決するためのカスタムソリューションがいくつかありますが、テーマスナックバーに正しい方法を提供することはおそらく良いことです。

まず、おそらくテーマで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レイアウトを作成することもできます。上記のリンクを参照してください。この方法がハックすぎると感じた場合、サポートライブラリの更新を通じてカスタムスナックバーを最後まで確実に信頼できる方法が必要な場合).

または、以下の回答を参照して、問題を解決するための同様の、おそらくより速い回答を探してください。

84
Mahonster

これはすでに回答済みですが、私が見つけた最も簡単な方法は、Html.fromHtmlメソッドとfontタグを使用して直接メイクすることです

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

これは で見つかりましたAndroid Design Support Libraryの新機能とそのスナックバーの使用方法は何ですか?

これは、スナックバーのテキストの色を変更するのに役立ちました。

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



更新:ANDROIDX: dblackkerがコメントで指摘しているように、新しいAndroidXサポートライブラリでは、Snackbar TextViewのIDを見つけるためのコードが次のように変更されます。

TextView tv = snack.findViewById(com.google.Android.material.R.id.snackbar_text);
147
Jarod Young

私は私のプロジェクトで使用するこの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
}

あなたが期待するような使用法:

Snackbar.make(view、R.string.your_string、Snackbar.LENGTH_LONG).setTextColor(Color.WHITE).show()

15
Richard

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();
13
Jet Zhao

わかりましたので、基本的にテキストの色を変更することで修正しました。

ライトテーマでは、Android:textColorPrimarynormal dark textに設定し、Android:textColorwhiteに設定しました。

すべてのテキストビューとボタンを更新してAndroid:textColor="?android:attr/textColorPrimary".を持つようにしました

スナックバーはtextColorから描画するため、他のすべてのテキストをtextColorPrimaryに設定します。

2017年1月編集:------------------------------------------ ----------

そのため、上記の編集済みの元の質問で述べられているように、コメント内でAndroid:textColorをテーマに定義しないでください。テーマ内のすべてのビューのテキストの色が変更されます。

13
Mahonster

1つのアプローチは、スパンを使用することです。

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

スパンを使用すると、1つのスナックバー内に複数の色とスタイルを追加することもできます。ここに素敵なガイドがあります:

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

10
ulcica

AndroidXに移行した場合は、com.google.Android.material.R.id.snackbar_textの代わりにAndroid.support.design.R.id.snackbar_textを使用して、スナックバーのテキストの色を変更します。

9
Rohit Maurya

私が見る唯一の方法は、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();
6
natario

コードをAndroidXに移行する場合、TextViewプロパティは次のようになります。

com.google.Android.material.R.id.snackbar_text
6
Matjaz Kristl

テーマを変更しました

Theme.AppCompat.Light.NoActionBar

Theme.AppCompat.NoActionBar 

光や他のテーマの代わりにシンプルなテーマを使用してみてください。

2
Pavneet_Singh

IDによってSnackbarでTextViewを見つけるためにダーティでハッキングされたソリューションを使用することに決め、すでにandroidxに移行している場合、コードは次のとおりです。

val textViewId = com.google.Android.material.R.id.snackbar_text
val snackbar = Snackbar.make(view, "Text", Snackbar.LENGTH_SHORT)
val textView = snackbar.view.findViewById(textViewId) as TextView
textView.setTextColor(Color.WHITE)
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();
2
makata

このライブラリを使用できます: https://github.com/SandroMachado/restaurant

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

免責事項:ライブラリを作成しました。

1
Sandro Machado

新しいAndroidX Jitpackコンポーネントごと

implementation 'com.google.Android.material:material:1.0.0'

私が作成したこの拡張機能を使用する

inline fun View.snack(message: String, length: Int = Snackbar.LENGTH_LONG,
 f: Snackbar.() -> Unit) {
val snack = Snackbar.make(this, message, length)
snack.f()
snack.show()
}

fun Snackbar.action(action: String, actionColor: Int? = null, textColor: Int? = null, listener: (View) -> Unit) {
setAction(action, listener)
actionColor?.let {
    setActionTextColor(it)
    }
textColor?.let {
    this.view.findViewById<TextView>(R.id.snackbar_text).setTextColor(it)
    }
}

このように使用します

btn_login.snack(
        getString(R.string.fields_empty_login),
        ContextCompat.getColor(this@LoginActivity, R.color.whiteColor)
    ) {
        action(getString(R.string.text_ok), ContextCompat.getColor(this@LoginActivity, R.color.gray_300),ContextCompat.getColor(this@LoginActivity, R.color.yellow_400)) {
            [email protected]()
        }
    }
0

Snackbarの両方のtextviewのインスタンスを取得するのに役立つ簡単なコードがあります。その後、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));
0
Summved Jain

Kotlinにいる場合、拡張機能を作成できます:

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()
0
Phil

IDによる検索は私にとってはうまくいかなかったので、別の解決策を見つけました。

Snackbar snackbar = Snackbar.make(view, text, duration);//just ordinary creation

ViewGroup snackbarView = (ViewGroup) snackbar.getView();
SnackbarContentLayout contentLayout = (SnackbarContentLayout) snackbarView.getChildAt(0);
TextView tvText = contentLayout.getMessageView();
tvText.setTextColor(/*your color here*/);

//set another colors, show, etc
0
Anrimian

貴重な開発時間を節約するために、私が使用している静的メソッドを以下に示します。

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

0
Ifta