想要為 Android App 統一更換字體,卻不想在每個 TextView、Button 逐個設定?這篇文章教你用最簡單的方式,透過自定義 Theme 或 Application 類,一次性套用全域字體,省時又好維護。
Android 提供了多種全域字體替換方案,主流做法有兩種:
<!-- res/font/my_font.xml -->
<font-family xmlns:android="https://schemas.android.com/apk/res/android">
<font android:fontStyle="normal" android:fontWeight="400" android:font="@font/my_regular" />
<font android:fontStyle="italic" android:fontWeight="400" android:font="@font/my_italic" />
</font-family>
<!-- res/values/styles.xml -->
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
<item name="android:fontFamily">@font/my_font</item>
</style>
在 AndroidManifest.xml 的 <application> 標籤套用 android:theme="@style/AppTheme" 即可全域生效。
// build.gradle
implementation "uk.co.chrisjenx:calligraphy:2.3.0"
// Application 類
@Override
public void onCreate() {
super.onCreate();
CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
.setDefaultFontPath("fonts/my_font.ttf")
.setFontAttrId(R.attr.fontPath)
.build());
}
// BaseActivity
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
使用 androidx.core:core-ktx 提供的 TypefaceCompat 搭配自定義 TextView 或 ViewFactory,可在不依賴第三方庫的情況下實現相容性較好的全域字體。
res/font/ (API 26+) 或 assets/fonts/ (舊方案)。新專案首選原生 fontFamily + XML 字體資源,簡單標準且效能最佳;舊專案維護可暫用 Calligraphy 或自行封裝 BaseActivity 統一處理。避免逐個控件設定,才是正確的架構思維。