返回

Android 奇特的字体替换方式

Android

序言

不知不觉中,Android 项目中的 TextView 会自行演变为 AppCompatTextView。起初,由于项目时间紧迫,我没有过多关注这个问题。直到最近一个项目需求的出现:全局更改项目中的数字字体。此时,我重新审视了 AppCompatTextView 的问题。在以往的项目中,替换字体并不是一件难事,而 AppCompatTextView 的出现却带来了意料之外的挑战。

TextView 与 AppCompatTextView 之间迷雾重重

乍看之下,TextView 和 AppCompatTextView 似乎功能相同,能够显示文本内容。然而,仔细探究后,你将发现它们之间存在着微妙的差异,尤其是当涉及到字体替换时。

传统上,通过使用 setTypeface() 方法,可以轻松地为 TextView 设置自定义字体。但当使用 AppCompatTextView 时,该方法却失效了。这是因为 AppCompatTextView 采用了不同的渲染机制,使得自定义字体无法正常应用。

拨开迷雾,揭秘字体替换奥秘

面对这一挑战,我深入研究了 AppCompatTextView 的源代码和相关文档。经过一番探索,我终于找到了解决字体替换问题的关键所在。

首先,我们需要使用 getSupportFragmentManager() 方法获取 SupportFragmentManager,然后使用该 FragmentManager 获取 AppCompatDelegate 对象。接着,使用 AppCompatDelegate 的 setLocalNightMode() 方法将夜间模式设置为支持字体替换所需的模式。最后,即可使用 setTypeface() 方法为 AppCompatTextView 设置自定义字体。

踏破荆棘,掌握替换字体精髓

以下是具体的代码实现:

// 获取 SupportFragmentManager
SupportFragmentManager fragmentManager = getSupportFragmentManager();

// 获取 AppCompatDelegate
AppCompatDelegate appCompatDelegate = fragmentManager.getPrimaryNavigationFragment().getDelegate();

// 设置夜间模式以支持字体替换
appCompatDelegate.setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);

// 为 AppCompatTextView 设置自定义字体
Typeface typeface = Typeface.createFromAsset(getAssets(), "fonts/custom_font.ttf");
appCompatTextView.setTypeface(typeface);

结语

通过深入理解 TextView 和 AppCompatTextView 之间的差异,以及 AppCompatTextView 特殊的渲染机制,我们得以掌握字体替换的精髓。虽然这需要一些额外的步骤和对底层实现的了解,但它为我们提供了更强大的自定义选项,让我们可以为 Android 应用程序赋予独特的视觉风格。