在Android中从XML文件访问资产文件夹下的字体

我试图做一个应用程序范围的字体更改,并创build一个样式文件来这样做。 在这个文件中(下面)我只是想改变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中访问“资产文件夹中的文件”?

Solutions Collecting From Web of "在Android中从XML文件访问资产文件夹下的字体"

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

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

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

更新:

现在我find了一种方法来创build一个扩展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目录中创build一个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中使用这个自定义视图时发现了一些性能问题,这是因为字体Object在每次加载视图时都会创build。 我find的解决scheme是初始化应用程序类中的字体,并通过引用该字体对象

 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; } } 

编辑2:

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


编辑:

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

你能做什么:

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

我find了另一种方法来做到这一点。

您必须使用本教程制作自己的TextView

这并不困难,在这之后你可以用你自己的字体来使用TextView

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

如果您使用单一字体,请使用此function。

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

Soorya是正确的,但是如果你必须在许多textView上放置相同的字体,我build议你把这个代码放在一个静态的方法里面,这个方法返回字体想要的。 这将减less代码中的行数。 或者甚至更好地创build一个扩展Application的类,并创build一个返回Typeface的GET方法。 该方法可以从应用程序中的任何Activity访问(无需使用静态variables或静态方法)。

fount的变化是android中非常基本的function,大部分是每个应用程序都需要的。因此,每个应用程序中只需要更改一次就可以减less我们的开发时间,所以我build议你看看这个链接FountChanger.class 。

希望充分利用你:

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

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

你只需要添加你想要在你的布局使用的字体。 喜欢这个:

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

你只是打这个公共电话和附加的方法

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

你有没有使用任何方法TextView设置字体家庭。

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

在你刚刚调用方法的任何地方与传递两个参数后,作出FontList calss。

我采取了机器人孩子的答案,并使任何字体的工作,只需通过直接input字体文件名到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, eg "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; } } 

值/ 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); } } } 

1.取消我们可以添加资产文件夹>在你的应用程序字体styles.ttfs然后
2.为string中的字体写入访问代码,如:

 <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.然后应用更改它是容易的过程改变孔应用程序。 快乐编码保持微笑

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

机器人:fontFamily中= “字体/ roboto_regular.ttf”

字体是资产文件夹中的子文件夹。