App应用字体大小保持固定以及关于Configuration的变化
前言
安卓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的变化相关推荐
- Android中App控制字体大小
Android中App字体不随系统字体大小的改变而改变 通常是在Application或Activity中复写getResources方法 ,下面的代码就实现了app字体不随系统字体大小改变. ove ...
- 改Android app字体,Android APP自定义字体大小修改
简单记录下今天做的自定义字体大小修改的功能 需求:添加具体字体自定义大小功能.不需要跟随系统字体大小改变而改变 1.首先看一下用到的调节字体大小的控件: 字体大小调节页 控件继承自系统的SeekBar ...
- Android 字体大小(fontScale)不随系统设置变化
需求 部分用户将系统字体大小设置的非常大,导致APP的文字大小显示异常. 想要实现的效果是,APP内字体大小不随系统设置的 "字体大小" 变化. 原始效果 系统的字体大小设置为&q ...
- 安卓APP的字体大小设置不受系统字体大小的影响
一,前言 近期在优化代码的过程中 发现这么一个问题 测试机有一个小屏的手机 展示的布局文件比较拥挤,而且字体较大.为了优化这一个问题 刚开始以为是字体适配的问题 后来无意中发现在手机的显示设置 -字体 ...
- 改Android app字体,Android 开发之修改 app 的字体大小
新的需求(可参见 微信和QQ改变字体): app 字体不随着系统字体大小变化 app 设置中有设置字体大小的开关,变大以后,整个 app 字体变大. 解决方案:(字体需要采用 dp 为单位,不能使用 ...
- Android App修改字体大小,且不随系统字体大小更改
在做混合开发时发现,无论是APP内的字体大小,还是前端的字体大小,都会随着系统字体大小发生变化.当遇到老人字体(特大号字体)时,有些页面的布局就乱掉了.而玩过游戏的都知道,所有游戏APP的字体都不会随 ...
- Android app设置字体大小和字体样式不随系统设置改变而改变
字体大小 在BaseActivity和BaseApplication里重写方法或者在基类里重写方法: /设置字体为默认大小,不随系统字体大小改而改变@Overridepublic void onCon ...
- android改变整个app字体大小,Android系统字体大小如何影响app的字体大小?
在Android应用开发过程中,一定会碰到本来完美的布局,在系统字体大小设置[最大]时变成一团浆糊.解决办法网上也有很多,但是分析原理的却几乎没看到.博主在碰到问题的第一时间也是直接用了网上的方法,即 ...
- 混合app 安卓用户将手机系统字体大小调整后会影响app的字体大小及样式
解决思路:即使用户调整手机字体大小也不会影响app的字体 解决方法:安卓工程师那边加一行webview.getSettings().setTextZoom(100)就可以禁止缩放,按照百分百显示.
最新文章
- Content-Type, Data-Type
- 根据rtk参数在arcgis中进行可视化
- C++ pair类模板
- 如何在Raspberry Pi上安装Fedora 25
- zend studio php发布_使用Zend Studio开发PHP项目
- 操作系统(4)状态机视角下的程序执行
- 浏览器中输入Google.com然后按下回车键
- 关于C++的建议,仅仅为了规范代码(二)
- Vista Ultimate X64 绝对正宗的激活工具
- iOS计算器:采用NSDecimalNumber 进行表达式的精准计算(计算字符串数学表达式)【案例:折扣计算器(完整demo源码)】
- 在计算机中常见的硬盘接口类型有,硬盘接口类型主要有哪几种?
- 永中科技的救命恩人是谁?
- 工作一般预留什么邮箱? 注册工作邮箱谨防几大雷区!
- python设置word背景色_Java 给Word不同页面设置不同背景
- 可以加急的计算机核心期刊,什么核心期刊可以加急
- 毕业论文的研究背景怎么写?
- Hash-based Shuffle内幕彻底解密
- 图神经网络--图神经网络
- 洛谷P3237 [HNOI2014]米特运输
- 17984 FFF团的怒火