【问题标题】:Accessing a font under assets folder from XML file in Android从Android中的XML文件访问资产文件夹下的字体
【发布时间】:2011-10-08 11:13:19
【问题描述】:

我正在尝试进行应用程序范围的字体更改并创建一个样式文件来执行此操作。在这个文件(如下)中,我只想更改 Android 的 TextAppearance 样式的字体值。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="NightRiderFont" parent="@android:style/TextAppearance">
        <item name="android:typeface"> /***help need here***/ </item>
    </style>
</resources>

但是字体在“assets/fonts/”中。我怎样才能访问这个字体,所以我可以使用这种风格作为主题来摆脱手动更改所有 TextViews 编程。

总结:如何在 XML 中访问“资产文件夹中的文件”?

【问题讨论】:

    标签: android android-assets android-gui android-fonts


    【解决方案1】:

    在这个的帮助下检查这个不需要以编程方式设置自定义字体。

    https://stackoverflow.com/a/27588966/4331353

    【讨论】:

    • 感谢节省时间
    【解决方案2】:

    你可以使用这个库:https://github.com/InflationX/Calligraphy

    您只需添加要在布局中使用的字体。 像这样:

    <TextView
     fontPath="fonts/verdana.ttf"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"/>
    

    【讨论】:

      【解决方案3】:

      //在代码中访问字体文件,

      Typeface type = Typeface.createFromAsset(getResources().getAssets(),"fonts/arial.ttf");
      textView.setTypeface(type);//assign typeface to textview
      

      //在assets文件夹->fonts(文件夹名)->arial.ttf(字体文件名)

      【讨论】:

        【解决方案4】:

        您可以将 .ttf 文件放在字体文件夹中,而不是 assets 文件夹。 要在运行 Android 4.1(API 级别 16)及更高版本的设备上使用 XML 功能中的字体支持,请使用支持库 26+。 右键res文件夹,新建->Android资源目录->选择字体->确定。 将您的“myfont.ttf”文件放入新创建的字体文件夹中。

        关于 res/values/styles.xml 添加,

        <style name="customfontstyle" parent="@android:style/TextAppearance.Small">
        <item name="android:fontFamily">@font/myfont</item>
        </style>
        

        在布局文件中添加 android:textAppearance="@style/customfontstyle",

        <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAppearance="@style/customfontstyle"/>
        

        参考:https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml

        【讨论】:

        • 错误表示“错误:序言中不允许内容。”
        【解决方案5】:

        1.首先我们可以添加 assets 文件夹> 在你的应用中你的字体 styles.ttfs 然后
        2.在字符串中编写字体的访问代码,例如:

        <string name="fontregular">OpenSans-Light.ttf</string>
        <string name="fontmedium">OpenSans-Regular.ttf</string>
        

        3.访问一些布局xml文件textview代码如下:

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fontFamily="@string/fontregular"
            android:textColor="@color/normalfont"
            android:textSize="@dimen/textregular"/>
        

        4.添加字体大小的尺寸:

        <dimen name="textregular">14sp</dimen>
        <dimen name="textheader">16sp</dimen>
        <dimen name="smalltext">12sp</dimen>
        <dimen name="littletext">10sp</dimen>
        <dimen name="hightfont">18sp</dimen>
        

        5.在颜色中添加字体颜色:

        <color name="normalfont">#666</color>
        <color name="headerfont">#333</color>
        <color name="aquablue">#4da8e3</color>
        <color name="orange">#e96125</color>
        

        6.然后应用更改,更改孔应用程序很容易。 快乐的编码保持微笑..

        【讨论】:

          【解决方案6】:

          编辑 2:

          xml 最终支持字体(也通过支持库向后兼容):https://developer.android.com/preview/features/fonts-in-xml.html


          编辑:

          我现在使用Calligraphy 库。这是自定义字体最简单的方法。

          你能做什么:

          • TextView 中的自定义字体
          • TextAppearance 中的自定义字体
          • 样式中的自定义字体
          • 主题中的自定义字体
          • FontSpannable 仅将字体应用于文本的一部分

          我找到了另一种方法。

          您必须使用此tutorial 制作自己的TextView

          这并不难,之后您可以使用 TextView 和您自己的字体。

          我不知道是否还有人在看这个,但我认为它可能会有所帮助。

          【讨论】:

            【解决方案7】:

            在我的研究中,没有办法将外部字体添加到 xml 文件中。 xml 中只有 3 种默认字体可用

            但是你可以使用这段代码在java中使用。

            Typeface tf = Typeface.createFromAsset(getAssets(),"fonts/verdana.ttf");  
            textfield.setTypeface(tf,Typeface.BOLD);
            

            更新:

            现在我找到了一种方法,方法是创建一个扩展 TextView 的自定义类并在 xml 文件中使用它。

            public class TextViewWithFont extends TextView {
                private int defaultDimension = 0;
                private int TYPE_BOLD = 1;
                private int TYPE_ITALIC = 2;
                private int FONT_ARIAL = 1;
                private int FONT_OPEN_SANS = 2;
                private int fontType;
                private int fontName;
            
                public TextViewWithFont(Context context) {
                    super(context);
                    init(null, 0);
                }
                public TextViewWithFont(Context context, AttributeSet attrs) {
                    super(context, attrs);
                    init(attrs, 0);
                }
                public TextViewWithFont(Context context, AttributeSet attrs, int defStyle) {
                    super(context, attrs, defStyle);
                    init(attrs, defStyle);
                }
                private void init(AttributeSet attrs, int defStyle) {
                    // Load attributes
                    final TypedArray a = getContext().obtainStyledAttributes(
                            attrs, R.styleable.font, defStyle, 0);
                    fontName = a.getInt(R.styleable.font_name, defaultDimension);
                    fontType = a.getInt(R.styleable.font_type, defaultDimension);
                    a.recycle();
                    MyApplication application = (MyApplication ) getContext().getApplicationContext();
                    if (fontName == FONT_ARIAL) {
                        setFontType(application .getArialFont());
                    } else if (fontName == FONT_OPEN_SANS) {
                        setFontType(application .getOpenSans());
                    }
                }
                private void setFontType(Typeface font) {
                    if (fontType == TYPE_BOLD) {
                        setTypeface(font, Typeface.BOLD);
                    } else if (fontType == TYPE_ITALIC) {
                        setTypeface(font, Typeface.ITALIC);
                    } else {
                        setTypeface(font);
                    }
                }
            }
            

            在xml中

            <com.example.customwidgets.TextViewWithFont
                    font:name="Arial"
                    font:type="bold"
                    android:layout_width="wrap_content"
                    android:text="Hello world "
                    android:padding="5dp"
                    android:layout_height="wrap_content"/>
            

            不要忘记在 xml 的根目录中添加架构

            xmlns:font="http://schemas.android.com/apk/res-auto"
            

            并在values 目录中创建一个attrs.xml 文件,其中包含我们的自定义属性:

            <?xml version="1.0" encoding="utf-8"?>
            <resources>
                <declare-styleable name="font">
                    <attr name="type">
                    <enum name="bold" value="1"/>
                        <enum name="italic" value="2"/>
                    </attr>
                    <attr name="name">
                        <enum name="Arial" value="1"/>
                        <enum name="OpenSans" value="2"/>
                    </attr>
                </declare-styleable>
            </resources>
            

            更新:

            在使用此自定义视图时发现一些性能问题 listview,这是因为每次创建字体对象 视图已加载。我找到的解决方案是在 Application 中初始化字体 分类并通过

            引用该字体对象
            MyApplication application = (MyApplication) getContext().getApplicationContext();
            

            应用程序类将如下所示

            public class MyApplication extends Application {
            
                private Typeface arialFont, openSans;
            
                public void onCreate() {
                    super.onCreate();
            
                    arialFont = Typeface.createFromAsset(getAssets(), QRUtils.FONT_ARIAL);
                    openSans = Typeface.createFromAsset(getAssets(), QRUtils.FONT_OPEN_SANS);
                }
            
                public Typeface getArialFont() {
                    return arialFont;
                }
            
                public Typeface getOpenSans() {
                    return openSans;
                }
            }
            

            【讨论】:

            • 是的,改全单字体很痛苦,不过好像也没什么可做的了。
            • 我知道。我之前也遇到过同样的情况。
            • 谢谢,这对我有用。但是有没有人遇到过关于为什么不能在 XML 文件中设置自定义字体的官方文档?
            • 谢谢!我将其更改为使用任何字体,只需在 XML 中输入字体路径:stackoverflow.com/a/39609788/473201
            【解决方案8】:

            我接受了 droid Kid 的回答,并使其适用于任何字体,只需将字体文件名直接输入 XML:

            layout.xml

            <RelativeLayout
                xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:custom="http://schemas.android.com/apk/res-auto" >
            
                <!-- where font file is at "assets/fonts/arial.ttf" -->
                <com.odbol.widgets.TextViewWithFont
                    ...
                    custom:fontFilePath="fonts/arial.ttf" />
            
            </RelativeLayout>
            

            Fonts.java

            public class Fonts {
            
                // use Weak so fonts are freed from memory when you stop using them
                private final static Map<String, Typeface> fonts = new WeakHashMap<>(5);
            
                /***
                 * Returns a font at the given path within the assets directory.
                 *
                 * Caches fonts to save resources.
                 *
                 * @param context
                 * @param fontPath Path to a font file relative to the assets directory, e.g. "fonts/Arial.ttf"
                 * @return
                 */
                public synchronized static Typeface getFont(Context context, String fontPath) {
                    Typeface font = fonts.get(fontPath);
            
                    if (font == null) {
                        font = Typeface.createFromAsset(context.getAssets(), fontPath);
                        fonts.put(fontPath, font);
                    }
            
                    return font;
                }
            }
            

            values/attrs.xml

            <resources>
            
                <declare-styleable name="TextViewWithFont">
                    <!-- a path to a font, relative to the assets directory -->
                    <attr name="fontFilePath" format="string" />
            
                    <attr name="type">
                        <enum name="bold" value="1"/>
                        <enum name="italic" value="2"/>
                    </attr>
                </declare-styleable>
            </resources>
            

            TextViewWithFont.java

            public class TextViewWithFont extends TextView {
                private int defaultDimension = 0;
                private int TYPE_BOLD = 1;
                private int TYPE_ITALIC = 2;
                private int fontType;
                private int fontName;
            
                public TextViewWithFont(Context context) {
                    super(context);
                    init(null, 0);
                }
                public TextViewWithFont(Context context, AttributeSet attrs) {
                    super(context, attrs);
                    init(attrs, 0);
                }
                public TextViewWithFont(Context context, AttributeSet attrs, int defStyle) {
                    super(context, attrs, defStyle);
                    init(attrs, defStyle);
                }
                private void init(AttributeSet attrs, int defStyle) {
                    // Load attributes
                    final TypedArray a = getContext().obtainStyledAttributes(
                            attrs, R.styleable.TextViewWithFont, defStyle, 0);
                    String fontPath = a.getString(R.styleable.TextViewWithFont_fontFilePath);
                    fontType = a.getInt(R.styleable.TextViewWithFont_type, defaultDimension);
                    a.recycle();
            
                    if (fontPath != null) {
                        setFontType(Fonts.getFont(getContext(), fontPath));
                    }
                }
                private void setFontType(Typeface font) {
                    if (fontType == TYPE_BOLD) {
                        setTypeface(font, Typeface.BOLD);
                    } else if (fontType == TYPE_ITALIC) {
                        setTypeface(font, Typeface.ITALIC);
                    } else {
                        setTypeface(font);
                    }
                }
            }
            

            【讨论】:

              【解决方案9】:

              您刚刚进行了公开调用并附加了这样的方法

              public class TextViewFontType {
              
              public Typeface typeface;
              
              public void fontTextView(final TextView textView, final String fonttype) {
                  typeface = Typeface.createFromAsset(textView.getContext().getAssets(), fonttype);
                  textView.setTypeface(typeface);
              }
              

              你有没有使用任何where方法TextView设置字体系列。

              public class FontList {
              
                  public static final String gothicbNormal="fonts/gothicb.ttf";
                  public static final String gothicbBold="fonts/gothicb.ttf";
              }
              

              在您通过传递两个参数调用任何方法之后创建 FontList 类。

              【讨论】:

                【解决方案10】:

                源代码更改是 android 中非常基本的功能,每个应用程序都需要它。所以每个人都只想在应用程序中更改一次,从而减少我们的开发时间,所以我建议您查看此链接 FountChanger.class.

                【讨论】:

                  【解决方案11】:

                  您可以从 assets 文件夹访问您的字体文件到 xml 文件。

                  android:fontFamily="fonts/roboto_regular.ttf"

                  fonts 是 assets 文件夹中的子文件夹。

                  【讨论】:

                    【解决方案12】:

                    如果您使用单一字体,则使用此功能。

                    public static void applyFont(final Context context, final View root, final String fontName) {
                            try {
                                if (root instanceof ViewGroup) {
                                    ViewGroup viewGroup = (ViewGroup) root;
                                    for (int i = 0; i < viewGroup.getChildCount(); i++)
                                        applyFont(context, viewGroup.getChildAt(i), fontName);
                                } else if (root instanceof TextView)
                                    ((TextView) root).setTypeface(Typeface.createFromAsset(context.getAssets(), fontName));
                            } catch (Exception e) {
                                Log.e("ProjectName", String.format("Error occured when trying to apply %s font for %s view", fontName, root));
                                e.printStackTrace();
                            }
                        }
                    

                    【讨论】:

                    • 我应该在哪里调用你的函数?
                    【解决方案13】:

                    希望你能充分利用:-

                    TextView text = (TextView) findViewById(R.id.custom_font);
                    Typeface font = Typeface.createFromAsset(getAssets(), "yourfont.ttf");
                    text.setTypeface(font);
                    

                    【讨论】:

                      【解决方案14】:

                      Soorya 是对的,但是如果您必须在许多 textView 上放置相同的字体,我建议您将该代码放在返回所需字体的静态方法中。它将减少代码中的行数。或者甚至更好地创建一个扩展 Application 的类并创建一个返回 Typeface 的 GET 方法。该方法可以从应用程序中的任何 Activity 访问(无需使用静态变量或静态方法)。

                      【讨论】:

                        猜你喜欢
                        • 2014-12-28
                        • 2012-05-13
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2014-05-04
                        • 1970-01-01
                        • 1970-01-01
                        • 2017-06-14
                        相关资源
                        最近更新 更多