在開發 Android App 時,我們不免需要對整個 App 設定的自訂字體。除了對每一個 TextView 設定你要的自訂字體的方法外,Android 提供一個讓我們可以對整個 App 設定自訂的字體的方法。
下載字體檔
我們用 Google Fonts 的 Montserrat 字體作為範例。瀏覽 Montserrat 的字體網站,你可以看到 Montserrat 有很多字體。點擊右上下載 Montserrat 的所有字體。

下載後,解開壓縮檔,你可以看到有下面這個字體檔。就如同網頁上所描述,每個字體檔是對應不同的粗細和斜體。

在把這些字體移入專案之前,我們必須先變更這個檔案的名稱,因為 Android 專案要求檔案名稱只能是小寫和下底線(_)。我們重新命名所有檔案,如下。

新增字體資源檔
將這些字體檔移入專案中的 res/font/ 資料夾下。如果 res/font/ 不存在的話,請先新增它。然後,在 res/font/ 下,新增一個 XML 檔叫 montserrat.xml,其程式碼如下。
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
<font
android:font="@font/montserrat_thin"
android:fontStyle="normal"
android:fontWeight="100" />
<font
android:font="@font/montserrat_thin_italic"
android:fontStyle="italic"
android:fontWeight="100" />
<font
android:font="@font/montserrat_extra_light"
android:fontStyle="normal"
android:fontWeight="200" />
<font
android:font="@font/montserrat_extra_light_italic"
android:fontStyle="italic"
android:fontWeight="200" />
<font
android:font="@font/montserrat_light"
android:fontStyle="normal"
android:fontWeight="300" />
<font
android:font="@font/montserrat_light_italic"
android:fontStyle="italic"
android:fontWeight="300" />
<font
android:font="@font/montserrat_regular"
android:fontStyle="normal"
android:fontWeight="400" />
<font
android:font="@font/montserrat_italic"
android:fontStyle="italic"
android:fontWeight="400" />
<font
android:font="@font/montserrat_medium"
android:fontStyle="normal"
android:fontWeight="500" />
<font
android:font="@font/montserrat_medium_italic"
android:fontStyle="italic"
android:fontWeight="500" />
<font
android:font="@font/montserrat_semi_bold"
android:fontStyle="normal"
android:fontWeight="600" />
<font
android:font="@font/montserrat_semi_bold_italic"
android:fontStyle="italic"
android:fontWeight="600" />
<font
android:font="@font/montserrat_bold"
android:fontStyle="normal"
android:fontWeight="700" />
<font
android:font="@font/montserrat_bold_italic"
android:fontStyle="italic"
android:fontWeight="700" />
<font
android:font="@font/montserrat_extra_bold"
android:fontStyle="normal"
android:fontWeight="800" />
<font
android:font="@font/montserrat_extra_bold_italic"
android:fontStyle="italic"
android:fontWeight="800" />
<font
android:font="@font/montserrat_black"
android:fontStyle="normal"
android:fontWeight="900" />
<font
android:font="@font/montserrat_black_italic"
android:fontStyle="italic"
android:fontWeight="900" />
</font-family>在 montserrat.xml 中,每一個字體檔有其對應的 <font>。
- android:font:指定對應的字體檔。
- android:fontStyle:設定字體檔是一般字體(normal)或是斜體(italic)。
- android:fontWeight:設定字體的粗細。這個粗細的數值在 Google Font Montserrat 網站上有詳細的標註,也可以在 FontWeight 上找到對應的列表。
當然你不是一定要在 montserrat.xml 中,把所有的字體都設定上去。假設你沒有設定 montserrat_bold (fontWeight 是 700)的話,那你設定 TextView 的 textStyle 為 bold 時,顯示出來的會是一般的字體。所以還是建議一開始就全部都新增上去。
<TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Wayne's Talk" android:textStyle="bold" />
設定自訂字體
接下來,我們要讓我們的專案使用 montserrat.xml 為預設的字體。在 res/themes/themes.xml 中,新增一個 <item>,如下。
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.AndroidFontExample" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
<item name="fontFamily">@font/montserrat</item>
</style>
</resources>這樣就設定完成了!
SDK 版本需求
<font> 需要 SDK 版本 26 以上,所以在 build.gradle 中將 minSdkVersion 設定為 26 以上。
...
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
defaultConfig {
applicationId "com.waynestalk.androidfontexample"
minSdkVersion 26
targetSdkVersion 29
versionCode 1
versionName "1.0"
}
}
...測試
將 activity_main.xml 的內容替換如下。我們不需要對 <TextView> 設定 fontFamily。當 textStyle 設定為 bold 時,它也會顯示 Montserrat 的 Bold 字體。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Regular" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Wayne's Talk"
android:textStyle="normal" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Bold" />
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Wayne's Talk"
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>









