热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android如何动态调整应用字体大小详解

这篇文章主要给大家介绍了关于Android如何动态调整应用字体大小的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

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

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

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

总结

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


推荐阅读
  • 国内BI工具迎战国际巨头Tableau,稳步崛起
    尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 解决微信电脑版无法刷朋友圈问题:使用安卓远程投屏方案
    在工作期间想要浏览微信和朋友圈却不太方便?虽然微信电脑版目前不支持直接刷朋友圈,但通过远程投屏技术,可以轻松实现在电脑上操作安卓设备的功能。 ... [详细]
  • SQLite 动态创建多个表的需求在网络上有不少讨论,但很少有详细的解决方案。本文将介绍如何在 Qt 环境中使用 QString 类轻松实现 SQLite 表的动态创建,并提供详细的步骤和示例代码。 ... [详细]
  • 本文探讨了如何通过最小生成树(MST)来计算严格次小生成树。在处理过程中,需特别注意所有边权重相等的情况,以避免错误。我们首先构建最小生成树,然后枚举每条非树边,检查其是否能形成更优的次小生成树。 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • 新冠肺炎疫情期间,各大银行积极利用手机银行平台,满足客户在金融与生活多方面的需求。线上服务不仅激活了防疫相关的民生场景,还推动了银行通过互联网思维进行获客、引流与经营。本文探讨了银行在找房、买菜、打卡、教育等领域的创新举措。 ... [详细]
  • 深入解析:手把手教你构建决策树算法
    本文详细介绍了机器学习中广泛应用的决策树算法,通过天气数据集的实例演示了ID3和CART算法的手动推导过程。文章长度约2000字,建议阅读时间5分钟。 ... [详细]
  • 尽管某些细分市场如WAN优化表现不佳,但全球运营商路由器和交换机市场持续增长。根据最新研究,该市场预计在2023年达到202亿美元的规模。 ... [详细]
  • 自学编程与计算机专业背景者的差异分析
    本文探讨了自学编程者和计算机专业毕业生在技能、知识结构及职业发展上的不同之处,结合实际案例分析两者的优势与劣势。 ... [详细]
  • Google最新推出的嵌入AI技术的便携式相机Clips现已上架,旨在通过人工智能技术自动捕捉用户生活中值得纪念的时刻,帮助人们减少照片数量过多的问题。 ... [详细]
  • 本文介绍了如何使用PHP代码实现微信平台的媒体素材上传功能,详细解释了API接口的使用方法和注意事项,确保文件路径正确以避免常见的错误。 ... [详细]
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • 阅读本文大约需要3分钟。微信8.0版本的发布带来了许多令人振奋的新功能,如烟花特效和改进的悬浮窗,引发了用户的热烈反响。 ... [详细]
  • 本文详细介绍如何在微信商户平台上下载支付操作证书,并将其正确配置到支付账户中。包括登录步骤、密码重置以及证书上传的具体操作。 ... [详细]
author-avatar
peaxcwxzl_372248
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有