如何将支持库snackbar文本颜色设置为android:textColor以外的其他东西?

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)

  • 在未来的支持库版本中,该ID确实已经更改,我现在得到一个空指针. (7认同)
  • 这是一个充其量的黑客 - 当android.support.design.R.id.snackbar_text的ID在支持库的未来版本中发生变化时会发生什么?是不是可以在styles.xml中覆盖某种默认的SnackBar样式? (6认同)
  • 更新-使用androidx,id现在如下:`snack.view.findViewById(com.google.android.material.R.id.snackbar_text)作为TextView` (3认同)
  • 万一其他人徒劳地寻找改变Snackbar文本大小的方法,就可以了! (2认同)
  • 仅供参考,您可以使用`snackbar_action`而不是`snackbar_text`对Action文本执行相同的操作.请参阅此答案以获取示例:http://stackoverflow.com/a/36800101/293280 (2认同)

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)

  • 我更喜欢这种解决方案,因为它是单线. (3认同)

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

  • 如果您迁移到AndroidX,请使用```com.google.android.material.R.id.snackbar_text```. (12认同)

Mah*_*ter 13

好吧,所以我通过基本上重新组织文本颜色的方式来修复它.

在我的光明主题中,我设置android:textColorPrimarynormal dark text我想要的,我设置android:textColorwhite.

我更新了所有文本视图和按钮 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中添加多种颜色和样式.这是一个很好的指南:

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


Roh*_*rya 9

如果您迁移到androidX,请使用com.google.android.material.R.id.snackbar_text而不是 android.support.design.R.id.snackbar_text更改小吃栏上文本的颜色。


nat*_*rio 6

我看到的唯一方法就是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)


Mat*_*stl 6

如果要将代码迁移到AndroidX,则TextView属性现在为:

com.google.android.material.R.id.snackbar_text
Run Code Online (Sandbox Code Playgroud)


ATo*_*Tom 5

目前(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必须定义,否则不会使用。