【问题标题】:Changing typeface of Snackbar更改 Snackbar 的字体
【发布时间】:2016-02-04 16:13:28
【问题描述】:

我通过以下代码构建 Snackbar:

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

       }
});

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

【问题讨论】:

    标签: java android android-snackbar


    【解决方案1】:

    您可以通过从小吃栏获取视图来设置字体

    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

    【讨论】:

      【解决方案2】:

      设置 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 );
      

      在我的示例中,我将 Action 的字体大小设置为 20 和 Bold,将 Text 的大小设置为 16 并允许最多 3 行。

      【讨论】:

        【解决方案3】:

        对于AndroidX

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

        【讨论】:

        • createFromAsset 对我不起作用,应用程序每次都说它找不到我的字体时崩溃了
        【解决方案4】:

        除了this answer: 现在打包通过id来查找snackbar的textview是

        val snackText = snackView.findViewById<TextView>(
                            com.google.android.material.R.id.snackbar_text)
        

        【讨论】:

          【解决方案5】:

          获取小吃店视图并应用自定义

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

          或者你可以看看thisthis

          谢谢。

          【讨论】:

            【解决方案6】:

            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
            

            【讨论】:

              【解决方案7】:

              获取资产

              AssetManager assets = context.getAssets();
              

              获取字体

              Typeface typeface = Typeface.createFromAsset(assets,PATH OF .TTF FILE);
              

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

              【讨论】:

                【解决方案8】:

                如果您想更改 Action Button 和 textview 的字体,请使用以下代码:

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

                【讨论】:

                  【解决方案9】:

                  对于在调用 createFromAsset() 时发生崩溃的每一个,您都可以使用

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

                  【讨论】:

                    猜你喜欢
                    • 2019-02-15
                    • 2016-05-07
                    • 2019-10-16
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-04-17
                    • 2020-02-13
                    • 1970-01-01
                    • 2014-03-25
                    相关资源
                    最近更新 更多