android - 在 Android 中向主题添加自定义字体

标签 android fonts textview

有没有办法在 Android 的 Themes 中添加自定义字体?

我已阅读 Quick Tip: Customize Android Fonts ,但在这里我们必须以编程方式将自定义字体添加到文本中。

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

但我想按样式/主题设置自定义字体。

最佳答案

很遗憾,Android 没有提供您想要的快速、简单和干净的方式来更改整个应用的字体。但最近我研究了这个问题,并创建了一些工具,让您无需任何编码即可更改字体(您可以通过 xml、样式甚至文本外观来完成这一切)。它们基于您在此处的其他答案中看到的类似解决方案,但具有更大的灵 active 。您可以在 this blog 上阅读所有相关信息,并查看 github 项目 here .

以下是如何应用这些工具的示例。将所有字体文件放在 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 属性xml布局。您可以在下面看到如何将字体应用于整个应用程序中的所有文本,只需编辑 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">

    <!-- Application theme -->
    <!-- Use a different parent if you don't want Holo Light -->
    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
        <item name="android:textViewStyle">@style/MyTextViewStyle</item>
    </style>

    <!-- Style to use for ALL text views (including FontTextView) -->
    <!-- Use a different parent if you don't want Holo Light -->
    <style name="MyTextViewStyle" parent="@android:style/Widget.Holo.Light.TextView">
        <item name="android:textAppearance">@style/MyTextAppearance</item>
    </style>

    <!-- Text appearance to use for ALL text views (including FontTextView) -->
    <!-- Use a different parent if you don't want Holo Light -->
    <style name="MyTextAppearance" parent="@android:style/TextAppearance.Holo">
        <!-- Alternatively, reference this font with the name "aspergit" -->
        <!-- Note that only our own TextView's will use the font attribute -->
        <item name="flFont">someFont</item>
        <item name="android:textStyle">bold|italic</item>
    </style>

    <!-- Alternative style, maybe for some other widget -->
    <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" >

    <!-- This text view is styled with the app theme -->
    <com.innovattic.font.FontTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="This uses my font in bold italic style" />

    <!-- This text view is styled here and overrides the app theme -->
    <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" />

    <!-- This text view is styled with a style and overrides the app theme -->
    <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 list 中应用主题。

关于android - 在 Android 中向主题添加自定义字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8787690/

相关文章:

ios - UITextView 字体为零

.net - 如何在我的 .NET 应用程序中找到用户的字体?

java - 如何在 Android 中通过 Java 调整文本大小

fonts - 谷歌网页字体渲染浏览器差异

android - 图像未使用 Html.fromhtml 在 TextView 中显示

android - 如何在使用 LinkMovementMethod 时捕获异常 (ActivityNotFoundException)

android - 启动 Activity 时停止应用程序进入前台

android - 使用 BluetoothChat 与 ELM327 通信

安卓 WebView : Mailto Unable to Implement

android - 保留关于不同版本软件的持久信息