更改Snackbar的字体类型

21

我用这段代码构建了 Snackbar:

Snackbar sb = Snackbar.make(drawer,  "message", Snackbar.LENGTH_LONG)
       .setAction("action", new View.OnClickListener() {
       @Override
       public void onClick(View view) {

       }
});

现在我想更改消息和操作按钮的字体,但找不到任何解决方案,该怎么办?

10个回答

44

您可以通过从 Snack bar 中获取视图来设置 Typeface。

TextView tv = (TextView) (mSnackBar.getView()).findViewById(android.support.design.R.id.snackbar_text);
Typeface font = Typeface.createFromAsset(getContext().getAssets(), "fonts/font_file.ttf");
tv.setTypeface(font);

对于AndroidX,请使用资源ID com.google.android.material.R.id.snackbar_text


15

同时为 Snackbar 文本和操作设置样式

你可以使用相同的方法来为 snackbar_textsnackbar_action 设置样式。

创建 Snackbar 后,可以使用以下方法获取与文本和操作相关联的视图,然后对视图应用任何调整。

Snackbar snackbar = Snackbar.make( ... )    // Create the Snackbar however you like.

TextView snackbarActionTextView = (TextView) snackbar.getView().findViewById( android.support.design.R.id.snackbar_action );
snackbarActionTextView.setTextSize( 20 );
snackbarActionTextView.setTypeface(snackbarActionTextView.getTypeface(), Typeface.BOLD);

TextView snackbarTextView = (TextView) snackbar.getView().findViewById(android.support.design.R.id.snackbar_text);
snackbarTextView.setTextSize( 16 );
snackbarTextView.setMaxLines( 3 );

在我的例子中,我设置了操作为字号20和加粗,并将文本设置为16号字体,最多允许3行。


15

对于AndroidXandroid.support.design.R.id.snackbar_text将不再可用。

请使用com.google.android.material.R.id.snackbar_text

如果您正在使用Kotlin,那么我建议您使用扩展函数:

fun Snackbar.changeFont()
{
    val tv = view.findViewById(com.google.android.material.R.id.snackbar_text) as TextView
    val font = Typeface.createFromAsset(context.assets, "your_font.ttf")
    tv.typeface = font
}

然后像这样调用:

mSnakeBar.changeFont()

2
createFromAsset 对我不起作用,每次应用程序崩溃并说找不到我使用的字体。我像这样从 ResourceCompat 中使用 getFont: val font = ResourcesCompat.getFont(context, R.font.my_font) - tahaak67

5
除了这个答案之外:现在可用于通过ID查找Snackbar的TextView的包是
val snackText = snackView.findViewById<TextView>(
                    com.google.android.material.R.id.snackbar_text)

4
获取小吃店视图并应用自定义
TextView tv = (TextView) sb.getView().findViewById(android.support.design.R.id.snackbar_text);
tv.setTextColor(Color.WHITE);
tv.setTypeface(Typeface.createFromAsset(
                    getAssets(),
                    "fonts/ur_file.ttf"));

或者这个

SpannableStringBuilder snackbarText = new SpannableStringBuilder();
snackbarText.append("Add ");
int boldStart = snackbarText.length();
snackbarText.append("bold color");
snackbarText.setSpan(new ForegroundColorSpan(0xFFFF0000), boldStart, snackbarText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
snackbarText.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), boldStart, snackbarText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
snackbarText.append(" to Snackbar text");

Snackbar.make(view, snackbarText, Snackbar.LENGTH_LONG).show();

您可以查看这个这个

谢谢。


2

对于那些仍在7年后阅读此文章的人,你可以在themes.xml文件中覆盖其主题父级,以更改整个应用程序的snackbar文本外观。

<style name="Theme.App" parent="Theme.MaterialComponents.*">
    ...
    <item name="snackbarTextViewStyle">@style/Widget.App.SnackbarTextView</item>
</style>


<style name="Widget.App.SnackbarTextView" parent="Widget.MaterialComponents.Snackbar.TextView">
    <item name="android:textAppearance">@style/your_snackbar_text_style</item>
</style>

然后在您的 styles.xml 文件中插入 your_snackbar_text_style 样式

    <style name="your_snackbar_text_style">
        <item name="android:fontFamily">@font/your_font</item>
    </style>

2
Support Library 26开始,字体可以用作资源
val mainTextView = view.findViewById(com.google.android.material.R.id.snackbar_text) as TextView
val font = ResourcesCompat.getFont(applicationContext, R.font.your_font)
mainTextView.typeface = font

0
获取资产
AssetManager assets = context.getAssets();

获取字体
Typeface typeface = Typeface.createFromAsset(assets,PATH OF .TTF FILE);

路径:font/robotoregular.ttf(如果.ttf文件存储在assets/font路径中)


0

对于每个在调用createFromAsset()时崩溃的人,您可以使用以下方法

Font font = ResourcesCompat.getFont(getApplicationContext(), R.font.your_font);

0
如果您想更改操作按钮和文本视图的字体,请使用以下代码:
Snackbar.make(this,message,Snackbar.LENGTH_LONG).also {snackbar ->
  snackbar.setAction("ok"){
     snackbar.dismiss()
  }
  val actionButton = snackbar.view.findViewById(com.google.android.material.R.id.snackbar_action) as Button
  val textview = snackbar.view.findViewById(com.google.android.material.R.id.snackbar_text) as TextView
  val font = Typeface.createFromAsset(context.assets, "fonts/your_custom_font")
  actionButton.typeface = font
  textview.typeface = font
  ViewCompat.setLayoutDirection(snackbar.view,ViewCompat.LAYOUT_DIRECTION_RTL)

}.show()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接