Mah*_*ter 88 android android-support-library snackbar android-design-library android-snackbar
所以我开始在设计支持库中使用新的Snackbar,但我发现当你在主题中定义"android:textColor"时,它会应用于快餐栏的文本颜色.如果您的主要文本颜色较暗,这显然是一个问题.

有没有人知道解决这个问题的方法,或者就如何为我的文字着色提出建议?
编辑2017年1月:(答案后)
虽然有一些自定义解决方案可以解决下面的问题,但提供主题Snackbars的正确方法可能会很好.
首先,你可能根本不应该android:textColor在你的主题中定义(除非你真的知道使用主题的范围).这基本上设置了连接到主题的每个视图的文本颜色.如果要在视图中定义非默认的文本颜色,请android:primaryTextColor在自定义视图中使用和引用该属性.
但是,对于应用主题Snackbar,请参考第三方材料文档中的质量指南: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);
Run Code Online (Sandbox Code Playgroud)
(您也可以创建自己的自定义Snackbar布局,请参阅上面的链接.如果此方法感觉过于苛刻,并且您希望通过可能的支持库更新获得自定义Snackbar的可靠方法,请执行此操作.)
或者,请参阅下面的答案,以获得类似且可能更快的答案来解决您的问题.
小智 157
我发现这是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();
Run Code Online (Sandbox Code Playgroud)
JPM*_*JPM 36
我知道这已经回答了,但我找到的最简单的方法是使用Html.fromHtml方法和font标签直接在make中
Snackbar.make(view,
Html.fromHtml("<font color=\"#ffffff\">Tap to open</font>").show()
Run Code Online (Sandbox Code Playgroud)
Ric*_*ard 15
创建了我在我的项目中使用的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
}
Run Code Online (Sandbox Code Playgroud)
像你期望的用法:
Snackbar.make(view,R.string.your_string,Snackbar.LENGTH_LONG).setTextColor(Color.WHITE).show()
Mah*_*ter 13
好吧,所以我通过基本上重新组织文本颜色的方式来修复它.
在我的光明主题中,我设置android:textColorPrimary为normal dark text我想要的,我设置android:textColor为white.
我更新了所有文本视图和按钮 android:textColor="?android:attr/textColorPrimary".
所以因为snackbar来自textColor,我只是将我的所有其他文本设置为textColorPrimary.
编辑2017年1月:---------------------------------------------- ------
正如评论所说,并且如上面编辑的原始问题中所述,您可能不应该android:textColor在主题中定义,因为这会更改主题内每个视图的文本颜色.
小智 13
黑客攻击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();
Run Code Online (Sandbox Code Playgroud)
ulc*_*ica 10
一种方法是使用跨度:
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();
Run Code Online (Sandbox Code Playgroud)
使用跨度,您还可以在一个Snackbar中添加多种颜色和样式.这是一个很好的指南:
如果您迁移到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();
Run Code Online (Sandbox Code Playgroud)
如果要将代码迁移到AndroidX,则TextView属性现在为:
com.google.android.material.R.id.snackbar_text
Run Code Online (Sandbox Code Playgroud)
目前(2020 年 1 月)与
com.google.android.material:material:1.2.0并且可能还有1.1.0
通过覆盖这些样式绝对是最好的方法:
<item name="snackbarStyle">@style/Widget.MaterialComponents.Snackbar</item>
<item name="snackbarButtonStyle">@style/Widget.MaterialComponents.Button.TextButton.Snackbar</item>
<item name="snackbarTextViewStyle">@style/Widget.MaterialComponents.Snackbar.TextView</item>
Run Code Online (Sandbox Code Playgroud)
如果你.Bridge在最后使用一个材质主题,出于某种原因,这两种风格都没有定义。所以 Snackar 将使用一些没有这些样式的遗留布局。
我在源代码中发现snackbarButtonStyle和 都snackbarTextViewStyle必须定义,否则不会使用。
| 归档时间: |
|
| 查看次数: |
35311 次 |
| 最近记录: |