そのため、デザインサポートライブラリで新しいスナックバーの使用を開始しましたが、テーマで「Android:textColor」を定義すると、スナックバーのテキストの色に適用されることがわかりました。プライマリテキストの色が暗い場合、これは明らかに問題です。
誰かがこれを回避する方法を知っていますか、テキストをどのように色付けするべきかについてのアドバイスがありますか?
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
レイアウトを作成することもできます。上記のリンクを参照してください。この方法がハックすぎると感じた場合、サポートライブラリの更新を通じてカスタムスナックバーを最後まで確実に信頼できる方法が必要な場合).
または、以下の回答を参照して、問題を解決するための同様の、おそらくより速い回答を探してください。
これはすでに回答済みですが、私が見つけた最も簡単な方法は、Html.fromHtml
メソッドとfont
タグを使用して直接メイクすることです
Snackbar.make(view,
Html.fromHtml("<font color=\"#ffffff\">Tap to open</font>").show()
これは で見つかりました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);
私は私のプロジェクトで使用するこの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()
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();
わかりましたので、基本的にテキストの色を変更することで修正しました。
ライトテーマでは、Android:textColorPrimary
をnormal dark text
に設定し、Android:textColor
をwhite
に設定しました。
すべてのテキストビューとボタンを更新してAndroid:textColor="?android:attr/textColorPrimary".
を持つようにしました
スナックバーはtextColor
から描画するため、他のすべてのテキストをtextColorPrimary
に設定します。
2017年1月編集:------------------------------------------ ----------
そのため、上記の編集済みの元の質問で述べられているように、コメント内でAndroid:textColor
をテーマに定義しないでください。テーマ内のすべてのビューのテキストの色が変更されます。
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つのスナックバー内に複数の色とスタイルを追加することもできます。ここに素敵なガイドがあります:
AndroidXに移行した場合は、com.google.Android.material.R.id.snackbar_text
の代わりにAndroid.support.design.R.id.snackbar_text
を使用して、スナックバーのテキストの色を変更します。
私が見る唯一の方法は、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();
コードをAndroidXに移行する場合、TextViewプロパティは次のようになります。
com.google.Android.material.R.id.snackbar_text
テーマを変更しました
Theme.AppCompat.Light.NoActionBar
に
Theme.AppCompat.NoActionBar
光や他のテーマの代わりにシンプルなテーマを使用してみてください。
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)
これは、カスタムカラーが必要なときに使用するものです
@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();
このライブラリを使用できます: https://github.com/SandroMachado/restaurant
new Restaurant(MainActivity.this, "Snackbar with custom text color", Snackbar.LENGTH_LONG)
.setTextColor(Color.GREEN)
.show();
免責事項:ライブラリを作成しました。
新しい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]()
}
}
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));
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()
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
貴重な開発時間を節約するために、私が使用している静的メソッドを以下に示します。
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();
}
}
これはどのように見えるかです: