系统字体大小设置

news/2025/3/16 2:00:23/


问题:

    在项目中遇到需要修改字体大小的问题。当修改设置里面字体大小的时候,根据情况决定当前应用是否需要同步系统的字体大小。一般在需要完整显示字体的应用中有此需求。华为荣耀的手机桌面似乎就针对这个做了判断,不管系统字体修改成什么样,似乎都是一个默认值,反正我是没有用肉眼看到有什么改变。虽然有点固定,但是好歹也整成了可以完整显示应用名称了。


分析:

    在设置中既然有该功能,那么我们就进去看看他的代码了。设置界面对于的xml为Settings_headers.xml,一般这个地方比较难找,新手一般只需要知道这个名字就好。找到DisplaySettings.java的writeFontSizePreference函数。就是这个函数负责字体改变之后的系统字体变更。函数代码如下:

public void writeFontSizePreference(Object objValue) {try {mCurConfig.fontScale = Float.parseFloat(objValue.toString());ActivityManagerNative.getDefault().updatePersistentConfiguration(mCurConfig);} catch (RemoteException e) {Log.w(TAG, "Unable to save font size");}}

可以看到是通过ActivityManagerNative来进行设置(注意这个是一个hide的类)。如果在自己的应用中,可以通过反射的方法获取,并设置字体大小,自己的应用需要声明权限android.permission.CHANGE_CONFIGURATION以及WRITE_SETTINGS权限,并且在Manifest.xml中加入android:configChanges="fontScale"代码,还需要声明shareUserId为System UID。参考此文。

    但是在我们的应用中显然需要知道系统的字体修改怎么通知到本应用的,以屏蔽或者修改系统通知中的默认字体大小,选择适合我们应用的字体大小。上面的函数最终会调用功能代码:mRemote.transact(UPDATE_PERSISTENT_CONFIGURATION_TRANSACTION, data, reply, 0);。通过Binder的方式,进行进程间通信,通知系统有东西改变了,赶紧更新。有一篇文章说到了语言更新机制,可以参考一下。

    当系统有更新时会触发Activity的onConfigurationChanged函数进行处理。所以直接重载该函数进行处理就可以了。当然在AndroidManifest.xml中,该Activity必须设置android:configChanges="fontScale"属性,因为我需要监听字体大小的监控,所以赋值为fontScale。


解决方法:

直接重载目的Activity的onConfigurationChanged,如下:

    public void onConfigurationChanged(Configuration newConfig) {// TODO Auto-generated method stubLog.i(TAG, "onConfigurationChanged newConfig.fontScale = " + newConfig.fontScale);if(newConfig.fontScale > 1.15f){newConfig.fontScale = 1.15f;}super.onConfigurationChanged(newConfig);Log.i(TAG, "onConfigurationChanged after");}

当大于某个值,直接设置成1.15即可。因为系统设置的字体大小:小、普通、大、超大,这些参数是在:package/apps/Settings/res/values/arrays.xml

    <string-array name="entryvalues_font_size" translatable="false"><item>0.85</item><item>1.0</item><item>1.15</item><item>1.30</item></string-array>

经过修改之后,编译发现有效。


方法二:


另外还有一种方法,不用这么麻烦,直接修改桌面中负责显示图标文字的布局的高就行了。参考源文件:

packages\apps\Launcher2\src\com\android\launcher2\PagedViewCellLayout.java见代码:

mOriginalCellHeight = mCellHeight =resources.getDimensionPixelSize(R.dimen.apps_customize_cell_height);

直接修改packages/apps/Launcher2/res/values/dimens.xml中:

<dimen name="apps_customize_cell_height">95dp</dimen>

修改到合适的值即可。这种方法更快捷。



http://www.ppmy.cn/news/813718.html

相关文章

【七天入门数据库】第一天 MySQL的安装部署

系列文章传送门&#xff1a; 【七天入门数据库】第一天 MySQL的安装部署 【七天入门数据库】第二天 数据库理论基础 【七天入门数据库】第三天 MySQL的库表操作 MySQL数据库存在多种版本&#xff0c;不同的版本在不同的平台上&#xff08;OS&#xff0c;也就是操作系统上&a…

图床项目之公网发布和测试

项目发布和测试 一、http服务测试1.1、ab http压力测试1.2、post测试&#xff08;注册请求和登录请求&#xff09; 二、性能测试2.1、生成测试脚本2.2、上传测试2.2.1、单客户端测试本地上传到本机服务器2.2.2、如果使用集群的方式进行测试 2.3、下载测试2.4、删除测试2.5、测试…

华为网络设备交换机路由器查看ARP表项命令方法

描述&#xff1a;华为网络设备交换机路由器查看ARP表项命令方法 命令&#xff1a; display arp

ARP表和MAC表的区别

1.arp表是三层设备才有的&#xff0c;如&#xff1a;路由器、主机电脑&#xff0c;arp&#xff1a;地址解析协议&#xff0c;已知目标ip地址来获取目标mac地址。mac表二层设备才有&#xff0c;如交换机。 2.arp表&#xff1a;阐述ip地址与mac地址的对应关系&#xff0c;而mac表…

MAC表和ARP表的老化时间:

路由表&#xff1a;目的地址、网络掩码、下一条ip地址、出接口、优先级、cost路由开销 arp表&#xff1a;ip地址、对应的mac地址、ip地址类型 arp -a 命令用来查看计算机本地arp表 mac表&#xff1a;VLAN号 mac地址、出端口 MAC表老化时间 300S ARP表&#xff1a;思科是 5分钟…

MAC表、ARP表、IP路由表区别比较

作用生成方式组成存在设备MAC表数据链路层转发&#xff08;交换机根据数据帧的目的MAC地址查看MAC表&#xff0c;根据表项由相应接口转发出去&#xff09;根据数据帧的源MAC进行学习&#xff08;数据帧从那个接口进来的&#xff0c;就把该接口以及该帧的源MAC学习记录下来&…

关于路由表,ARP表,MAC表的一些理解

以下均为个人理解&#xff0c;如有不对之处&#xff0c;希望大家不吝指教。 数据在网络传输中有几个比较重要的东西&#xff1a;一个是IP地址&#xff0c;分为源地址和目的地址&#xff0c;一个是MAC地址&#xff0c;分为源MAC地址和目的MAC地址&#xff0c;发送一个信息需要填…

linux ping 不通 arp incomplete,关于show arp表,显示Incomplete问题

最近出现一个问题&#xff0c;在核心交换机上查看交换机的ARP表的时候&#xff0c;很多ARP表项目会显示如信息&#xff1a; Internet 172.21.6.1 0 Incomplete ARPA 这表示没有学习到IP地址的mac地址&#xff0c;找了很久&#xff0c;终于找到问题&#xff0…