Android 动态调整应用字体大小

Android应用字体大小默认随系统设置的字体大小而变化,但您可能不希望您的应用字体大小随系统设置变化,想要自己控制,例如微信。本文简单介绍一下如何实现应用字体大小动态调整而不是依赖系统设置

字体大小变化是由android.content.res.Configuration.class类中的fontScale控制的,因此,若想我们的应用字体大小变化不随系统变化而是由我们自主控制,就需要我们修改fontScale为我们自己设置的数值。由于Android系统更新的问题,可能您无法通过网上的答案来实现您的目的。根据目前笔者的测试情况,我们需要从Activity层面进行处理才能自主控制字体大小变化,为了方便统一处理,将控制逻辑放在了Application中,下面贴出实例图片及代码(由于笔者水平实在是low,不会做滑动条来控制字体大小,因此,示例中使用了两个TextView来点击控制字体大小变化,哈哈哈~)


public class MainApplication extends Application implements Application.ActivityLifecycleCallbacks {

    private List<Activity> activityList;
    private float fontScale;
    private SharedPreferences preferences;
    private static MainApplication mainApplication;

    @Override
    public void onCreate() {
        super.onCreate();
        init();
    }

    private void init() {
        mainApplication = this;
        preferences = PreferenceManager.getDefaultSharedPreferences(this);
        fontScale = getFontScale();
        registerActivityLifecycleCallbacks(this);
    }

    public static float getFontScale() {
        float fontScale = 1.0f;
        if (mainApplication != null) {
            fontScale = mainApplication.preferences.getFloat("fontScale", 1.0f);
        }
        return fontScale;
    }

    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        if (activityList == null) {
            activityList = new ArrayList<>();
        }
        // 禁止字体大小随系统设置变化
        Resources resources = activity.getResources();
        if (resources != null && resources.getConfiguration().fontScale != fontScale) {
            android.content.res.Configuration configuration = resources.getConfiguration();
            configuration.fontScale = fontScale;
            resources.updateConfiguration(configuration, resources.getDisplayMetrics());
        }
        activityList.add(activity);
    }

    @Override
    public void onActivityStarted(Activity activity) {

    }

    @Override
    public void onActivityResumed(Activity activity) {

    }

    @Override
    public void onActivityPaused(Activity activity) {

    }

    @Override
    public void onActivityStopped(Activity activity) {

    }

    @Override
    public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

    }

    @Override
    public void onActivityDestroyed(Activity activity) {
        if (activityList != null) {
            activityList.remove(activity);
        }
    }

    public static void setAppFontSize(float fontScale) {
        if (mainApplication != null) {
            List<Activity> activityList = mainApplication.activityList;
            if (activityList != null) {
                for (Activity activity : activityList) {
                    if (activity instanceof SettingActivity) {
                        continue;
                    }
                    Resources resources = activity.getResources();
                    if (resources != null) {
                        android.content.res.Configuration configuration = resources.getConfiguration();
                        configuration.fontScale = fontScale;
                        resources.updateConfiguration(configuration, resources.getDisplayMetrics());
                        activity.recreate();
                        if (fontScale != mainApplication.fontScale) {
                            mainApplication.fontScale = fontScale;
                            mainApplication.preferences.edit().putFloat("fontScale", fontScale).apply();
                        }
                    }
                }
            }
        }
    }
}

首先,我们需要让Application实现ActivityLifecycleCallbacks接口,并注册ActivityLifecycleCallbacks以便监控所有Activity,并维护一个Activity列表。在onActivityCreated方法中我们可以监控每个Activity的创建,当新建一个Activity时,获取其Resource资源,进而判断Configuration.fontScale数值是否与我们自己的fontScale数值(默认1.0,即大小没有经过调整)相等,若数值不一致时,修改之。其实,只要我们通过一个Activity修改了Configuration.fontScale数值,那么所有其他Activity再获取Configuration.fontScale数值时,其值均为我们修改过之后的数值。通过这一波操作,已经保证我们的应用的字体大小不随系统设置变化了。

下面看如何动态调整应用字体大小,看一下setAppFontSize方法。该方法遍历Activity列表,获取Resource配置信息并修改其fontScale数值,需要注意的是,若想及时生效,需要调用Activity的recreate()方法。
注意:recreate()方法会导致Activity重建,但幸运的是调用该方法,系统会触发onSaveInstanceState回调,因此强烈建议您在该回调方法中做好数据保存以便重建时恢复数据。
另外一个建议是:不要把字体大小设置选项层级埋的太深,最好放在首页,因为这样放置,当调整字体大小时只会导致首页重建,不会影响其他页面,将影响将到最小

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,039评论 25 707
  • EnglishVersion ->_->:https://github.com/jiang111/awesome-...
    聂顺阅读 1,225评论 0 4
  • 新请的护工不早不晚站在他们身后小心谨慎建议道:“邓先生,十一点半了,你们回去吧!放心,我会看护好卓先生的。” 好,...
    小鹿故事集阅读 305评论 0 0
  • 清晨起来,天上一朵朵白云夹着在蓝天中,溫度适宜。我们吃完早餐,继续坐着旅游车出发。导游给我们讲解台湾的珊瑚是这么生...
    清清白白灬阅读 245评论 0 0
  • 不要刻意改变自己,也不要想改变他,如果这样还能一路走下去,这就是最好的答案。——《我可能不会爱你》 宽容不是道德,...
    胖球66阅读 181评论 0 0