首页 > 其他分享 >关于Android切换系统字体大小和字体样式导致App崩溃或者界面错乱的问题

关于Android切换系统字体大小和字体样式导致App崩溃或者界面错乱的问题

时间:2024-06-12 18:14:59浏览次数:19  
标签:return App value COMPLEX 字体 字体大小 Android resources

测试小姐姐测试版本的时候,把系统字体给变大了,再回到app直接崩溃,分析原因找问题,主要有2种方式
第一种.设置字体大小我们都是用的是sp,如果改为dp就不会有这个问题, 我相信大部分写android的都是用的sp,现在改回来肯定是头痛,别着急,我们先看看源码

 
public static float applyDimension(int unit, float value,
                                       DisplayMetrics metrics){
        switch (unit) {
        case COMPLEX_UNIT_PX:
            return value;
        case COMPLEX_UNIT_DIP:
            return value * metrics.density;
        case COMPLEX_UNIT_SP:
            return value * metrics.scaledDensity;
        case COMPLEX_UNIT_PT:
            return value * metrics.xdpi * (1.0f/72);
        case COMPLEX_UNIT_IN:
            return value * metrics.xdpi;
        case COMPLEX_UNIT_MM:
            return value * metrics.xdpi * (1.0f/25.4f);
        }
        return 0;
    }

  

density不会受到用户配置的影响,而scaledDensity除了会受到用户配置的影响,其它方面是跟density一致的。
终于真相大白!因此使用 sp 单位时字体大小会受到用户配置系统字体的影响。
但是这种方式还是不推荐.

第二种
直接通过代码控制,不跟随系统改变字体

/**
  * 重写 getResource 方法,防止系统字体影响
 */
    @Override
    public Resources getResources() {//禁止app字体大小跟随系统字体大小调节
        Resources resources = super.getResources();
        if (resources != null && resources.getConfiguration().fontScale != 1.0f) {
            android.content.res.Configuration configuration = resources.getConfiguration();
            configuration.fontScale = 1.0f;
            configuration.setToDefaults();//设置默认 不能使用这个,会修改很多对方的属性值,比如在5.1版本适配有问题
            resources.updateConfiguration(configuration, resources.getDisplayMetrics());
        }
        return resources;
    }

这样又有这个问题,Android 8.0上会发现这样修改字体的缩放比例是不起作用.需要在Activity中同样进行复写getResources()方法。

还得注意一个问题,切换了系统字体后,回到Activity会重启当前页面,为了避免这种问题,需要在:在manifest中的Activity中添加: android:configChanges="orientation|screenSize|keyboardHidden|fontScale"

这样可能就完美解决问题了

解决完上面的问题了,有善于思考的同学就问了,这个是解决切换系统的字体大小产生的问题,如果我切换系统字体的样式呢?出现问题又该怎么解决?

其实有了上面的基础,解决这个问题就容易的多了。

在切换字体大小的时候,我们知道系统会发送通知,我们设置fontScale属性就可以了。但是切换字体的样式,系统并没有通知,谷歌官方也没有,stack上也是各种提问,没有找到监听的事件或者方法。

切换样式之后,我们可以观察一下Activity的生命周期,依然是onDestroy(),onCreate()....因为是异常的destroy,系统会把当前的状态信息存入saveInstanceState()方法里面的bundle,onCreate()的时候,从bundle里面取出来进行恢复。有时候,保存的bundle状态不对,导致界面加载错乱。

解决的方法:

在onCreate()的时候,判断bundle里面是否有数据,如果有数据,进行赋空处理,然后走一遍正常的流程,就可以了。具体代码如下:

@Override

protectedvoidonCreate(Bundle savedInstanceState) {

if(null!= savedInstanceState){
savedInstanceState =null;
}

super.onCreate(savedInstanceState);}

  这个配置可以放在项目的BaseActivity里面,可以减少对现有代码的改动。

思考:其实这个时候,你会发现,在切换字体大小的时候,也可以这样配置,甚至这样配置之后就不用管fontScale之类的属性了,让界面自己刷新去吧,反正第二次的onCreate()跟重新进入app效果是一样的。





标签:return,App,value,COMPLEX,字体,字体大小,Android,resources
From: https://www.cnblogs.com/changyiqiang/p/18244441

相关文章

  • Android attachBaseContext作用
    在Android应用程序中,attachBaseContext()方法是一个回调方法,它在onCreate()方法之前被调用,其作用是向应用程序的Context对象中添加或修改一些信息。通常,开发人员会在这个方法中执行一些初始化操作,如创建全局对象、设置默认语言等。具体来说,attachBaseContext()方法的主要......
  • Apple ID已成历史,在ios18中正式更名为Apple Account
    随着iOS18的首个开发者预览版成功推送,众多热衷于尝鲜的用户已纷纷升级并开启全新体验。在这个版本中,备受瞩目的AppleID正式迎来了它的进化——更名为AppleAccount,并且拥有了中文名称“Apple账户”或简称“苹果账户”。不过目前官网还称之为AppleID,预计会在9月份随iPhone......
  • Android中自定义Toast文字大小
    在Android开发中,Toast是一种轻量级的提示框,用于在屏幕上显示临时消息。一般情况下,Toast显示的文字大小是固定的,无法直接改变。但是,我们可以通过一些方法来实现在Toast中显示不同大小的文字。方法一:使用自定义布局创建custom_toast.xml布局文件,如:<?xmlversion="1.0"encoding......
  • uniapp vue3 实现自定义Switch效果
    <template><viewclass="container"@click="toggleSwitch"><label:class="isOn?'switch-checked':'switch-nochecked'"><viewclass="open">{{activ......
  • uniapp小程序,携带参数返回上一页
    功能介绍:这是我在开发微信小程序时实现的一个功能,在提交订单页面(A页面)点击设置收货地址跳转到地址列表页面(B页面)去选择地址后回退到订单页面并显示所选择的地址。具体实现:<!--HTML结构不完整,仅做参考,部分类名为作者项目中的配置--><viewclass='addressCon'v-if......
  • applitools eyes 基于视觉检查的自动化测试
    Applitools是一家专注于视觉AI的自动化测试和监控解决方案的公司,其核心产品围绕着视觉回归测试和UI测试。ApplitoolsEyesApplitoolsEyes是其旗舰产品,是一个基于AI的自动化测试工具,专注于检测和修复UI错误。它使用视觉AI来识别界面的变化,并能够跨不同浏览器和设备进行比较,确......
  • 短剧对接广告联盟app平台开发源码
    短剧对接广告联盟APP平台开发的源码涉及多方面的技术整合与策略设计。以下是一些关键步骤和考虑因素:需求分析:深入理解短剧APP的市场定位、目标用户群体以及广告联盟的具体需求。这有助于确定系统的基本功能和特色服务,确保开发的APP能够满足用户和广告主的实际需求1。系统......
  • 【APP移动端自动化测试】第二节.Appium介绍和常用命令代码实现
    文章目录前言一、Appium介绍和安装二、python代码功能实现   2.1helloappium参数详解   2.2在脚本内启动其他app   2.3 获取app的包名和界面名   2.4 关闭app和驱动对象   2.5 安装和卸载以及是否安装app   2.6 将应用置于......
  • SSM-小区物业管理系统-48954(免费领源码+开发文档)可做计算机毕业设计JAVA、PHP、爬虫、
    基于SSM小区物业管理系统摘要随着计算机科学技术日渐成熟,人们已经深刻认识到了计算机功能的强大,计算机已经进入到了人类社会发展的各个领域,并且发挥着十分重要的作用。每个社区的物业管理是一项系统而复杂的工作,它需要一个团队互相配合、分工协作。在该领域,传统的手工存取......
  • mybatis的mapper中的sql涉及嵌套且外部引用导致的问题:XML fragments parsed from prev
    假设xxx.xml中有类似下方的sql嵌套:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.xx......