前言

安卓4.0之后系统设置->显示里面新增了字体大小设置的选项.看下你自己的安卓机,如果你将字体大小从小号一直增大到特大号,有没有发现某些安装的app里面的字体大小也随着变化了?这样可能是便于了阅读,但是app里面本来能显示完全的内容可能因此就只显示了部分.实际上,我们可以看一下QQ、淘宝等大厂的应用,里面的字体大小并不会随着系统设置的大小而变化.

初始解决方法

网上早已给出了解决办法,在Application,也就是app定义的入口处添加以下代码:

@Override
public void onCreate(){super.onCreate();Resources resources = getResources();resources.getConfiguration().fontScale = 1.0f;resources.updateConfiguration(null, null);
}

就是说,在应用初始化的时候,通过上下文得到应用的资源,进而得到对应于当前应用资源的配置(Configuration),将配置里代表字体缩放的变量(fontScale)置为1,也就是默认值,不进行任何缩放.

新的问题

这时候如果先设置好系统字体的大小为超大或其它,再次进入应用,字体仍然保持之前的大小.但是!如果你没有对该页面(设定最简单的情况,是一个Activity)进行任何设置,那么切换屏幕方向,比如从竖屏到横屏,会发现字体大小又变化了,本来可以显示完全的现在换行了.日志打印获取其字体大小也可以证明确实是变化了:

I/MainActivity_LOG: 该页面重新创建
I/MainActivity_LOG: 字体的大小:48.0
I/MainActivity_LOG: onStart
I/MainActivity_LOG: onResume
I/MainActivity_LOG: onPause
I/MainActivity_LOG: onStop
I/MainActivity_LOG: onDestroy
I/MainActivity_LOG: 该页面重新创建
I/MainActivity_LOG: 字体的大小:62.0

意识到可能跟屏幕方向切换后,页面销毁后重新创建的过程有关.而屏幕方向是设备配置的一个属性,屏幕旋转又是影响配置变化的因素之一.所以要看一下Configuration Change.

Configuration变化后页面的生命周期

public class MainActivity extends AppCompatActivity {public static final String TAG = "MainActivity_LOG";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.i(TAG, "该页面重新创建");TextView textView = findViewById(R.id.textView);float textSize = textView.getTextSize();Log.i(TAG, "字体的大小:" + textSize);}@Overridepublic void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);Log.i(TAG, "config更新了");}@Overrideprotected void onStart() {super.onStart();Log.i(TAG, "onStart");}@Overrideprotected void onResume() {super.onResume();Log.i(TAG, "onResume");}@Overrideprotected void onPause() {super.onPause();Log.i(TAG, "onPause");}@Overrideprotected void onStop() {super.onStop();Log.i(TAG, "onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.i(TAG, "onDestroy");}
}

查看日志后,发现:
1.清单文件中不声明任何属性,切屏后Activity销毁后重建,重新走了一遍生命周期,并且不会回调onConfiguration方法,切横屏和切竖屏都是.日志如下:

I/MainActivity_LOG: onPause
I/MainActivity_LOG: onStop
I/MainActivity_LOG: onDestroy
I/MainActivity_LOG: 该页面重新创建
I/MainActivity_LOG: onStart
I/MainActivity_LOG: onResume

2.在清单文件中声明Activity的android:configChanges属性,如果只是单独声明orientation或者screenSize,和没有声明的情况一样.

3,在清单文件中声明android:configChanges="orientation|screenSize",才可以成功回调onConfigurationChanged方法.并且此时不会销毁当前的Activity,也就是不会重走各个生命周期.

原因分析

到这大概可以清楚,虽然应用初始化的时候更新了Configure的fontScale=1,但如果出现了销毁页面重新创建的情况,之前保存的配置就会失效.其实稍微看一下源代码就明白了,调用getResources().getConfiguration()返回的是在ResourcesImpl类中初始化的时候创建的Configuration对象,调用其无参构造方法后,最终调用的是unSet方法:

public void unset() {setToDefaults();fontScale = 0;
}

该方法最终将字体缩放值置为0,也就是适应系统字体的变化,就出现了前面说的问题.

Configuration Changes引起的其它情况

一开始,我采取的是配置清单文件中Activity的属性,比如将屏幕的方向写死android:screenOrientation="portrait",或者避免Activity销毁重建android:configChanges="orientation|screenSize",这样做的话,旋转屏幕不会造成已修改的配置失效.但是引起Configuration Changes的情况很多,不仅仅是切屏:比如修改设备的默认语言,修改系统字体大小.从打印日志可以看出这时候页面仍然进行了销毁和重建的过程,已更新的字体大小配置又失效了.

解决方法

现在提供了一种解决方法,虽然不太优雅.既然外部的各种操作无法全部考虑到,并且都可能会引发页面的销毁和重建,也就是说无法控制Configuration的重置,在不能修改API的情况下,能想到的就是在基类BaseActivity(或其它)初始化的时候都调用一下更新字体配置的方法.或者更好一点的方式,Application提供了一个监听方法registerActivityLifecycleCallbacks,可以全局监听应用里面所有已声明的Activity的生命周期.当监听到应用创建的时候,都更新一下.

public class MainApplication extends Application {@Overridepublic void onCreate() {super.onCreate();this.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {@Overridepublic void onActivityCreated(Activity activity, Bundle savedInstanceState) {Resources resources = getResources();resources.getConfiguration().fontScale = 1.0f;resources.updateConfiguration(null, null);}@Overridepublic void onActivityStarted(Activity activity) {}@Overridepublic void onActivityResumed(Activity activity) {}@Overridepublic void onActivityPaused(Activity activity) {}@Overridepublic void onActivityStopped(Activity activity) {}@Overridepublic void onActivitySaveInstanceState(Activity activity, Bundle outState) {}@Overridepublic void onActivityDestroyed(Activity activity) {}});}
}

总结

关于字体大小还有一种解决方式,就是在布局文件中全部用px表示,因为手机的分辨率就是以px定义的,所以无论系统怎么设置字体大小,配置如何更新,显示在界面上的字体大小都是固定的.当然这也带来了适配的问题,因为谷歌官方建议用dp定义尺寸的.这涉及到了安卓的屏幕兼容性问题,可以用鸿洋的方法解决:Android屏幕适配方案.不过这种方法自己根据屏幕分辨率计算出的以160dpi为基准的px大小,没有考虑到屏幕尺寸,也是无法解决所有的问题.
目前我测试没有发现明显的问题,当然方式有点简单粗暴.如果有更好的实现方式,也希望各位能告诉我一下,欢迎交流.

App应用字体大小保持固定以及关于Configuration的变化相关推荐

  1. Android中App控制字体大小

    Android中App字体不随系统字体大小的改变而改变 通常是在Application或Activity中复写getResources方法 ,下面的代码就实现了app字体不随系统字体大小改变. ove ...

  2. 改Android app字体,Android APP自定义字体大小修改

    简单记录下今天做的自定义字体大小修改的功能 需求:添加具体字体自定义大小功能.不需要跟随系统字体大小改变而改变 1.首先看一下用到的调节字体大小的控件: 字体大小调节页 控件继承自系统的SeekBar ...

  3. Android 字体大小(fontScale)不随系统设置变化

    需求 部分用户将系统字体大小设置的非常大,导致APP的文字大小显示异常. 想要实现的效果是,APP内字体大小不随系统设置的 "字体大小" 变化. 原始效果 系统的字体大小设置为&q ...

  4. 安卓APP的字体大小设置不受系统字体大小的影响

    一,前言 近期在优化代码的过程中 发现这么一个问题 测试机有一个小屏的手机 展示的布局文件比较拥挤,而且字体较大.为了优化这一个问题 刚开始以为是字体适配的问题 后来无意中发现在手机的显示设置 -字体 ...

  5. 改Android app字体,Android 开发之修改 app 的字体大小

    新的需求(可参见 微信和QQ改变字体): app 字体不随着系统字体大小变化 app 设置中有设置字体大小的开关,变大以后,整个 app 字体变大. 解决方案:(字体需要采用 dp 为单位,不能使用 ...

  6. Android App修改字体大小,且不随系统字体大小更改

    在做混合开发时发现,无论是APP内的字体大小,还是前端的字体大小,都会随着系统字体大小发生变化.当遇到老人字体(特大号字体)时,有些页面的布局就乱掉了.而玩过游戏的都知道,所有游戏APP的字体都不会随 ...

  7. Android app设置字体大小和字体样式不随系统设置改变而改变

    字体大小 在BaseActivity和BaseApplication里重写方法或者在基类里重写方法: /设置字体为默认大小,不随系统字体大小改而改变@Overridepublic void onCon ...

  8. android改变整个app字体大小,Android系统字体大小如何影响app的字体大小?

    在Android应用开发过程中,一定会碰到本来完美的布局,在系统字体大小设置[最大]时变成一团浆糊.解决办法网上也有很多,但是分析原理的却几乎没看到.博主在碰到问题的第一时间也是直接用了网上的方法,即 ...

  9. 混合app 安卓用户将手机系统字体大小调整后会影响app的字体大小及样式

    解决思路:即使用户调整手机字体大小也不会影响app的字体 解决方法:安卓工程师那边加一行webview.getSettings().setTextZoom(100)就可以禁止缩放,按照百分百显示.

最新文章

  1. Content-Type, Data-Type
  2. 根据rtk参数在arcgis中进行可视化
  3. C++ pair类模板
  4. 如何在Raspberry Pi上安装Fedora 25
  5. zend studio php发布_使用Zend Studio开发PHP项目
  6. 操作系统(4)状态机视角下的程序执行
  7. 浏览器中输入Google.com然后按下回车键
  8. 关于C++的建议,仅仅为了规范代码(二)
  9. Vista Ultimate X64 绝对正宗的激活工具
  10. iOS计算器:采用NSDecimalNumber 进行表达式的精准计算(计算字符串数学表达式)【案例:折扣计算器(完整demo源码)】
  11. 在计算机中常见的硬盘接口类型有,硬盘接口类型主要有哪几种?
  12. 永中科技的救命恩人是谁?
  13. 工作一般预留什么邮箱? 注册工作邮箱谨防几大雷区!
  14. python设置word背景色_Java 给Word不同页面设置不同背景
  15. 可以加急的计算机核心期刊,什么核心期刊可以加急
  16. 毕业论文的研究背景怎么写?
  17. Hash-based Shuffle内幕彻底解密
  18. 图神经网络--图神经网络
  19. 洛谷P3237 [HNOI2014]米特运输
  20. 17984 FFF团的怒火

热门文章

  1. 什么是迭代(迭代法)
  2. 【python】输出列表元素,以空格/逗号为分隔符
  3. ACM2021辽宁省赛:CDEFGILM
  4. 凯云软件测试项目管理系统系统描述
  5. python3 + scrapy爬取妹子图(meizitu.com)
  6. Ubuntu16.04 Modelsim 10.2c安装
  7. 让View具有弹性效果的动画——SpringAnimation
  8. 空气质量指数计算公式
  9. 上海网站排名优化找哪家?清法网络助你一臂之力
  10. Java咖啡馆---第一杯咖啡