Android如何动态调整应用字体大小详解
作者:乱世白衣 发布时间:2023-08-26 10:13:52
前言
为什么要动态设置字体大小?由于项目面对的是中老年客户项目中自带的字体无法满足客户需求。
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回调,因此强烈建议您在该回调方法中做好数据保存以便重建时恢复数据。
另外一个建议是:不要把字体大小设置选项层级埋的太深,最好放在首页,因为这样放置,当调整字体大小时只会导致首页重建,不会影响替他页面,将影响将到最小
来源:https://www.jianshu.com/p/f21ee733fd96
猜你喜欢
- 问题现象:HTTP Status 403-Invalid CSRF Token 'null' was found on th
- 关于面向对象和封装的个人理解类和对象类:对事物的一种描述(具有共同属性和行为的事物的抽象),例如手机,属性:品牌价格,行为:玩游戏,刷vx;
- 三层架构将整个业务应用划分为:(1)界面UI层(2)业务逻辑层(3)数据访问层对于复杂的系统分层可以让结构更加清晰,模块更加独立,便于维护。
- Android Handler移除Message详解问题:1.removeMessage(what)函数是否只能移除对应what值的Mess
- 本文实例讲述了Android编程实现的首页左右滑动切换功能。分享给大家供大家参考,具体如下:很多软件会选择左右滑动的主界面,实现方式也很多,
- 在开发中,我们会遇到将不同组织架构合并成tree这种树状结构,那么如果做呢?实际上,我们也可以理解为如何将拥有父子关系的list转成树形结构
- 题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数例如在数组{7
- Android自定义短信验证码组件,供大家参考,具体内容如下效果图1.布局实现因为要禁用光标,所以我用TextView代替了EditText
- Java synchronized 关键字 可以将一个代码块或一个方法标记为同步代码块。同步代码块是指同一时间只能有一个线程执行的代码,并且
- 一、是什么当下很多公司都采取前后端分离的开发模式,前端和后端的工作由不同的工程师完成。在这种开发模式下,维持一份及时更新且完整的 Rest
- 建立工程前需要导入POI包。POI相关jar包下载地址:http://poi.apache.org/download.html1.解析.xl
- 前提准备:1. 项目中至少需要引入的jar包,注意版本: a) core-renderer.jar&nb
- 日志输出是所有系统必备的,很多开发人员可能因为常常使用log4j而忽视了JDK logging模块,两者之间是否有联系?是怎样的联系?JDK
- c语言关闭socket的两种方式一、shutdown()#include<sys/socket.h>int shutdown(i
- SpringBoot 动态修改Scheduled场景:可配置的 Scheduled 执行时间,正常的 Scheduled 是在项目启动的时候
- 这篇文章主要介绍了Spring @Conditional注解原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 实现过滤器和 * 首先,我们先来看一下二者在 Spring Boot 项目中的具体实现,这对后续理解二者的区别有很大的帮助。a) 实现过滤器
- Java的集合类是一种特别有用的工具,它可以用于存储数量不等的多个对象,并可以实现常用的数据结构,如栈、队列等。Java集合还可以用于板寸具
- 本文是基于springboot完成测试测试代码地址如下:https://github.com/Dr-Water/springboot-act
- 问题说明:IDEA编译的时候乱码,Build Output提示信息乱码�����。解决方案一:将Help—>Edit Cusuom V