很遗憾,Android没有提供一种快速、简单、干净的方法来更改您整个应用程序的字体。但是我最近研究了这个问题并创建了一些工具,可以让您在不编写任何代码的情况下更改字体(您可以通过xml、样式甚至文本外观来完成所有操作)。它们基于类似其他答案中看到的解决方案,但允许更大的灵活性。您可以在
此博客上阅读有关其所有信息,并在
此处查看github项目。
以下是如何应用这些工具的示例。将所有字体文件放在assets/fonts/
中。然后,在一个xml文件中声明这些字体(例如res/xml/fonts.xml
),并在应用程序早期使用TypefaceManager.initialize(this, R.xml.fonts);
加载此文件(例如,在Application类的onCreate中)。xml文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<familyset>
<!-- Some Font. Can be referenced with 'someFont' or 'aspergit' -->
<family>
<nameset>
<name>aspergit</name>
<name>someFont</name>
</nameset>
<fileset>
<file>Aspergit.ttf</file>
<file>Aspergit Bold.ttf</file>
<file>Aspergit Italic.ttf</file>
<file>Aspergit Bold Italic.ttf</file>
</fileset>
</family>
<!-- Another Font. Can be referenced with 'anotherFont' or 'bodoni' -->
<family>
<nameset>
<name>bodoni</name>
<name>anotherFont</name>
</nameset>
<fileset>
<file>BodoniFLF-Roman.ttf</file>
<file>BodoniFLF-Bold.ttf</file>
</fileset>
</family>
</familyset>
现在你可以在样式或xml中使用这些字体(前提是你使用了我上面提到的工具),通过在自定义TextView com.innovattic.font.FontTextView
中设置flFont属性来实现。下面你可以看到如何通过编辑res/values/styles.xml
,将字体应用到整个应用程序中的所有文本:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
<item name="android:textViewStyle">@style/MyTextViewStyle</item>
</style>
<style name="MyTextViewStyle" parent="@android:style/Widget.Holo.Light.TextView">
<item name="android:textAppearance">@style/MyTextAppearance</item>
</style>
<style name="MyTextAppearance" parent="@android:style/TextAppearance.Holo">
<item name="flFont">someFont</item>
<item name="android:textStyle">bold|italic</item>
</style>
<style name="StylishFont">
<item name="flFont">anotherFont</item>
<item name="android:textStyle">normal</item>
</style>
</resources>
伴随着
res/layout/layout.xml
的附带内容:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<com.innovattic.font.FontTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This uses my font in bold italic style" />
<com.innovattic.font.FontTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:flFont="anotherFont"
android:textStyle="normal"
android:text="This uses another font in normal style" />
<com.innovattic.font.FontTextView
style="@style/StylishFont"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This also uses another font in normal style" />
</LinearLayout>
不要忘记在您的Android清单中应用主题。