前言

为什么要动态设置字体大小?由于项目面对的是中老年客户项目中自带的字体无法满足客户需求。

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

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

public class MainApplication extends Application implements Application.ActivityLifecycleCallbacks {

private List 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 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回调,因此强烈建议您在该回调方法中做好数据保存以便重建时恢复数据。

另外一个建议是:不要把字体大小设置选项层级埋的太深,最好放在首页,因为这样放置,当调整字体大小时只会导致首页重建,不会影响替他页面,将影响将到最小

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

android程序字体大小,Android如何动态调整应用字体大小详解相关推荐

  1. android程序字体大小,Android 动态调整应用字体大小

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

  2. 动态调整打印机纸张大小

    动态调整打印机纸张大小 江苏省昆山市地方税务局 信息管理系统中经常要提供各种打印功能,例如报表打印.凭证打印以及发票打印.在这些打印过程中所需要纸张的大小往往是不一致的,例如,打印报表有可能使用A4 ...

  3. 动态调整linux分区大小,GParted 动态调整Linux分区大小

    在虚拟化环境中虚拟机运行一段时间后数据量持续增长,磁盘分区都需要进行扩容,对于Windows系统相对简单,在磁盘瘦格式的状态下直接修改虚拟机磁盘大小,在系统中的磁盘管理里扩展分区即可,实时生效连重启都 ...

  4. java写一个android程序_【Android开发笔记】3.编写第一个Android程序

    前言 上一节我们通过一个Demo熟悉了Eclipse的基本使用.如何在模拟器和手机中运行以及如何打包成APK,但没具体编写代码,相信很多同学已经按耐不住了吧,这一节我们会动手编写代码来熟悉Androi ...

  5. Android 进阶——Framework 核心之Android Storage Access Framework(SAF)存储访问框架机制详解(一)

    文章大纲 引言 一.Android Storage Access Framework 二.Storage Access Framework 的主要角色成员 1.Document Provider 文件 ...

  6. Android 进阶——Framework 核心之Android Storage Access Framework(SAF)存储访问框架机制详解(二)

    文章大纲 引言 一.DirectFragment 1.当选中DirectoryFragment中RecyclerView的Item时 2.选中DirectoryFragment中RecyclerVie ...

  7. android收藏功能demo,Android使用Realm数据库实现App中的收藏功能(代码详解)

    前 言 App数据持久化功能是每个App必不可少的功能,而Android最常用的数据持久化方式主要有以下的五种方式: 使用SharedPreferences存储数据: 文件存储数据: SQLite数据 ...

  8. css中的单位换算_css大小单位px em rem的转换和详解

    css大小单位px em rem的转换和详解 PX特点 1. IE无法调整那些使用px作为单位的字体大小: 2. 国外的大部分网站能够调整的原因在于其使用了em或rem作为字体单位: 3. Firef ...

  9. 太阳动态ip代理为您详解使用代理ip常见的几个关键点及其解决方案

    一个ip支撑不了整个爬虫项目的运营,因此程序员常需要建立代理ip池或者与第三方代理ip软件打交道.作为优质的代理ip服务商,太阳动态ip代理为您详解使用代理ip常见的几个关键点及其解决方案. IP检验 ...

最新文章

  1. 为什么 HashMap 加载因子一定是0.75?而不是0.8,0.6?
  2. 听说你是参加智能车比赛的?
  3. 使用matlab播放特定频率的声音
  4. 小程序自定义组件:摇奖小游戏
  5. Linux centosVMware shell编程 for循环、while循环、break跳出循环、continue结束本次循环、exit退出整个脚本...
  6. C++嵌入Python,以及两者混用
  7. MAC系统如何连接Windows共享文件?MAC系统连接Win共享文件的方法
  8. android结束进程,卧薪尝胆70天内推入职阿里,附答案
  9. 【层级多标签文本分类】融合标签层级结构的文本分类
  10. 卫星与太阳的方位角与交会角
  11. 不能错过!9个让你随时保持精力充沛的习惯
  12. firefox 屏蔽Backspace按键的后退功能
  13. 怎么将EXCEL的网格线打印出来,教程在这里,EXCEL里的网格线如何打印出来
  14. Visual Studio 各个版本之间的功能比较
  15. [搞笑图片] 搞笑图片
  16. mysql创建用户只能访问数据库中一张表
  17. 从endnote导出参考文献发现没有参考文献信息
  18. 从键盘输入一个四位数,输出该四位数的个位,十位,百位和千位数分别是什么。
  19. 一种RC滤波电路的验证
  20. Apache安装与基本配置

热门文章

  1. R数据分析:如何做数据的非线性关系,多项式回归的做法和解释
  2. PHP开发的仿山楂岛留言程序源码
  3. JSP 登陆系统 登陆界面/处理界面/成功界面/失败界面/注销界面(无数据库版) 包含源文件分享
  4. 双网卡的网络路由配置
  5. java实现高德地图app,Android 高德地图入门demo,最新高德地图实现方法,附源码及apk...
  6. 【3】Ubuntu18.04下载与安装,以及中文输入法的安装
  7. redis学习--三种特殊数据类型,GEO地理位置,HyperLogLog,BitMap
  8. electron_笔记
  9. php 时间间隔月数,PHP计算两个时间相差的年数、月数和天数程序
  10. Scala Case Class介绍