Android 兼容8.0 App全局字体调节、禁止App字体随系统字体大小而更改

2023-11-12

在APP中,字体的大小单位一般会用sp,然而在改变系统字体大小时,App字体就会随着系统字体大小改变而改变,这就可能造成APP布局的错位。

造成这种情况的原因是,sp单位除了受屏幕密度影响外,还受到用户的字体大小影响,通常情况下,建议使用sp来跟随用户字体大小设置。除非一些特殊的情况,不想跟随系统字体变化的,可以使用dp”。按照这么说,布局宽高固定写死的地方应该统一用dp显示字体,因为一旦用户在设置中调大字体,宽高写死的布局显示就乱了。

针对这种情况,查找网上的方法也很多,大多是这样的方法 (重写 Application 或 BaseActivity 中的方法):

/**
   * 重写 getResource 方法,防止系统字体影响
   */
  @Override
  public Resources getResources() {//禁止app字体大小跟随系统字体大小调节
    Resources resources = super.getResources();
    Configuration configuration = new Configuration();
    configuration.setToDefaults(); 
    resources.updateConfiguration(configuration, resources.getDisplayMetrics());
    return resources;
  }

从上代码可以看出Configuration是new出来的对象,那么系统中原本自带的许多属性可能就遗失了。在大多数的情况下,我们不会察觉到这样的差异。但是在某些情况下,发现出现了空指针;还有就是,configuration.setToDefaults()时,会把所有属性都设置成系统默认,对于有特殊需求的 app 来说是不合理的,这里应该只修改字体大小的设置

在此就不再多做赘述,最总解决办法是在Application中重写getResources()方法:

/**
   * 重写 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;
      resources.updateConfiguration(configuration, resources.getDisplayMetrics());
    }
    return resources;
  }

两者代码的不同之处,请自行比较吧!

满心欢喜的以为问题就这么愉快地解决了。将app放在Android8.0上运行,然后将手机的字体设置成最大后发现,问题并没有解决。这时还需要在BaseActivity中同样进行重写getResources()方法。这样当前字体大小的问题就可以解决了。

到这里问题应该是解决了,惊奇的发现Android 8.0的手机不单单有字体大小设置,还有一项显示模式 ,将显示模式设成最大后,发现app的界面超出了屏幕。(注:部分Android7.0手机也会有显示模式这一项,但是将显示模式设置成最大,不会影响app的界面的,只有Android8.0及其以上才会出现这种情况)。


目前这种情况我还没有找到解决的办法,有了解决办法,我会在这个博客更新,大神们有解决办法还望留言告知我,大家相互分享一下

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 兼容8.0 App全局字体调节、禁止App字体随系统字体大小而更改 的相关文章

  • BottomNavigationView - 如何获取选定的菜单项?

    我使用BottomNavigationView来切换片段 如何获取当前选定的菜单项 以防止重新打开片段 BottomNavigationView bottomNavigationView BottomNavigationView findV
  • 使用 Android 前台服务为 MediaPlayer 创建通知

    问题就在这里 我目前正在开发一个应用程序 该应用程序必须提供 A 广播播放器 来自 URL 的 AAC 直播 还有一个播客播放器 来自 URL 的 MP3 流 该应用程序必须能够在后台运行 Android 服务 并通过以下方式向用户公开持续
  • Android - 如何一次只允许播放一个 MediaPlayer 实例?

    我正在尝试创建一个简单的 Sound board Android 应用程序 使用 ListView 项目作为按钮 顺便说一句 我是一个新手程序员 我的想法是 我按下一个按钮 就会播放一个特定的声音文件 如果我在播放声音时按下任何按钮 它应该
  • Android 应用程序在后台运行时保存数据

    目前我正在开发 xmmp 客户端 当应用程序位于前台时 该客户端工作得很好 但由于事实上 当应用程序处于后台时 我在 Application 类中保存了大量数据 复杂的 ArrayList 字符串和布尔值作为公共静态 每个字段都被垃圾收集
  • 与 Admob 广告单元 ID 混淆

    我跟着tutorial https developers google com admob android quick start在我的应用程序中创建广告横幅 到目前为止 这有效 我可以看到测试广告 但是 本教程指示我在两个不同的位置使用两
  • 如何更新 Firebase 中的节点密钥?

    如何重命名14 04 2017 node 没有用于重命名节点的 API 您必须获取节点的值 使用新名称将其保存到数据库并删除旧节点
  • 如何将安卓手机从睡眠状态唤醒?

    如何以编程方式将 Android 手机从睡眠状态唤醒 挂起至内存 我不想获取任何唤醒锁 这意味着手机在禁用 CPU 的情况下进入 真正的 睡眠状态 我想我可以使用某种RTC 实时时钟 机制 有人有例子吗 Thanks 为了让Activity
  • 设置从 Facebook 登录获取用户电子邮件 ID 的权限

    我在用着Facebook 3 0 SDK对于安卓 我必须实施Facebook登录 我正在访问用户的基本信息 例如姓名 用户 ID 但我也想访问用户的电子邮件 我浏览了很多博客和论坛 但不知道该怎么做 我正在使用我自己的 android 按钮
  • 在我的Android中,当其他应用程序想要录制音频时如何停止录音?

    在我的应用程序中 服务通过 AudioRecord 持续录制音频 当我的应用程序运行时 其他与音频记录相关的应用程序 例如 Google 搜索 无法工作 如何知道何时有其他应用想要录制音频 以便我可以停止录制以释放资源 答案是MediaRe
  • Firebase:如何在Android应用程序中设置默认通知渠道?

    如何设置default通知渠道通知消息当应用程序在后台运行时会出现什么情况 默认情况下 这些消息使用 杂项 通道 如你看到的在官方文档中 https firebase google com docs cloud messaging andr
  • 请求位置更新参数

    这就是 requestLocationUpdates 的样子 我使用它的方式 requestLocationUpdates String provider long minTime float minDistance LocationLis
  • 在 Jetpack Compose 中启动动画矢量 Drawable

    我有一个动画矢量可绘制R drawable my anim 我想在 Jetpack Compose 中展示并开始 可绘制对象显示 渲染正确 但动画未启动 这是撰写视图 Composable fun SplashView Surface mo
  • 带有自定义阵列适配器的微调器不允许选择项目

    我使用自定义阵列适配器作为微调器 但是 当在下拉列表中选择一个项目时 下拉列表保留在那里 并且微调器不会更新 这是错误行为 与使用带有字符串的通用数组适配器相比 这是自定义类 我错过了什么吗 谢谢 public class Calendar
  • ROOM迁移过程中如何处理索引信息

    CODE Entity tableName UserRepo indices Index value id unique true public class GitHubRepo PrimaryKey autoGenerate true p
  • MediaCodec 创建输入表面

    我想使用 MediaCodec 将 Surface 编码为 H 264 使用 API 18 有一种方法可以通过调用 createInputSurface 然后在该表面上绘图来对表面中的内容进行编码 我在 createInputSurface
  • Android构建apk:控制MANIFEST.MF

    Android 构建 APK 假设一个 apk 包含一个库 jar 例如 foo jar 该库具有 META INF MANIFEST MF 这对于它的运行很重要 但在APK中有一个包含签名数据的MANIFEST MF 并且lib jar
  • 如何将设备连接到Eclipse?

    我无法解决这个简单的问题 我正在尝试通过 USB 电缆将我的设备连接到 Eclipse 在我的 PC 上 我已经安装了 Eclipse 和 Android SDK 并且在模拟器上运行该程序运行良好 我已在我的电脑上下载并安装了 Samsun
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • 用于推送通知的设备令牌

    我正在实施推送通知服务 我需要创建一个数据库来存储 4 个移动平台的所有设备令牌 我想根据他们的平台 iOS Android BlackBerry WP7 来组织它们 但是有什么方法可以区分平台 这样如果我只想向 Android 用户发送消
  • android Accessibility-service 突然停止触发事件

    我有一个 AccessibilityService 工作正常 但由于开发过程中的某些原因它停止工作 我似乎找不到这个原因 请看一下我的代码并告诉我为什么它不起作用 public class MyServicee extends Access

随机推荐

  • python 函数中的省略号

    1 省略号在python里也是个对象 2 赋值号后面省略号 给该变量赋值一个default值 具体python的机制我不清楚 应该是在类里面定义好的 或者参数省略 3 冒号后面省略号 表示函数的定义内容不写了 函数的定义内容不写了 相当于p
  • PTA6(python)

    python程序设计06 面向对象 7 1 求两点之间距离 7 2 类的定义和使用 7 3 优异生查询 类和对象 7 4 新型计算器 7 5 学生类的使用 7 6 三维向量运算 7 7 继承类应用 7 8 有关队列操作 7 9 有关堆栈操作
  • python调用everything批量查找表格中的文件名在磁盘中是否存在

    python调用everything批量查找表格中的文件名在磁盘中是否存在 介绍 Everything 配置 使用openpyxl读写文件 读文件 写文件 BeautifulSoup的使用 创建 beautifulsoup 对象 soup
  • 基础实验篇

    uORB是PX4 Pixhawk系统中非常重要且关键的模块之一 是用于无人机模块间通信的协议机制 本篇将详细介绍uORB并详细拆解uORB消息读写与自定义实验流程 三 基础实验篇 uORB消息读写与自定义实验 三 01 基于RflySim平
  • 代码随想录一刷-Day01

    代码随想录一刷 Day01 LeetCode704 二分查找 这道属于是入门必刷了 但是虽然能做出来 在细节上还是不够注意 public int search int nums int target if nums null nums le
  • @excel注解_EasyPOI 详细教程以及注解的使用

    因为项目的原因需要用到POI来操作Excel 文档 以前都是直接使用POI来操作的 但是最近听到easypoi的存在 所以自己简单的尝试了下 别说 他还真的挺好用的 Easypoi介绍 Easypoi 为谁而开发 不太熟悉poi的 不想写太
  • LocalDate的用法与String互转

    一 LocalDate常用用法 1 1 申明定义 LocalDate formatDate LocalDate of 2020 2 5 自定义 LocalDate today LocalDate now 获取当前日期 1 2 getX 获取
  • WebRTC实时音视频技术的整体架构介绍

    WebRTC 简介 WebRTC 名称源自网页实时通信 Web Real Time Communication 的缩写 是一个支持网页浏览器进行实时语音通话或视频聊天的技术 是谷歌2010年以6820万美元收购Global IP Solut
  • Echarts 无数据时显示“暂无数据”

    当我们的图表遇到接口数据为空或者筛选之后无数据的情况 会显示成这样 就比较丑 所以需要更换成指定的某些文字做提示 通过配置title 曲线救国 title show true text 暂无数据 left center top center
  • JAVA小练习149——需求: 一家三口都要工作, 儿子工作负责绘画, 妈妈可以在儿子的工作上进行增强---上涂料, 爸爸的工作就是在妈妈的基础上增强---上画框

    interface Work public void work class Son implements Work Override public void work System out println 在画画 class Mother
  • python实践:让所有奇数都在偶数前面,而且奇数升序排列,偶数降序排序

    给定一个任意长度数组 实现一个函数 让所有奇数都在偶数前面 而且奇数升序排列 偶数降序排序 如字符串 1982376455 变成 1355798642 class Solution def SortNum self num list par
  • js查找数组重复元素

    方法一 利用sort方法 先使用sort方法将数组排序 再来判断找出重复元素 function res arr var temp arr sort sort function a b if a b temp indexOf a 1 temp
  • 数值分析复习笔记-第七章-非线性方程求根

    Chapter7 非线性方程求根 7 1 前言 本质 对一些n次代数多项式or超越方程 它们的根是难以通过解析方法求得 因此需采取数值方法 主要有 二分法 不动点迭代法 迭代加速 牛顿迭代法 牛顿法 割线法 7 2 二分法 数学基础 零点定
  • 多边形等分算法

    多边形等分
  • Python基础-- 9函数(中)

    一 函数的返回值 返回值就是函数执行以后返回的结果 通过return来指定函数的返回值 return后面可以跟任意对象 返回值甚至可以是 个函数 二 文档字符串 在定义函数时 可以在函数内部编写文档字符串 文档字符串就是对函数的 说明 he
  • Linux中TAB补全显示设备空间不足问题

    今天在使用linux中习惯性的使用tab键进行补全信息 发现无论在何处按下tab都会显示这样报错 图中因为我用了xshell工具 这里报错是中文的 这个时候要检查下自己的空间是否充足 可使用df查看设备目录使用空间大小 可以将一下不用的目录
  • 概率论的几种常考分布总结

    两点分布 0 1分布 X b 1 p 二项分布 X b n p k 0 1 2 n 指数分布 参数为 线性分布 参数为a b 泊松分布 X k 0 1 2 n
  • 程序员常犯的5个非技术性错误

    一个好的软件开发人员需要培养两种技能 技术技能和非技术技能 不幸的是一些开发者只注重技术的部分 以致养成一些陋习 下面是最常犯的5个非技术性错误 0 缺乏自律 Jim Rohn曾经说过 自律是目标和成果之间的桥梁 我一直认为 不论是成为一名
  • 半导体芯片测试介绍:CP、FT、STL

    CP测试 Chip Probing 对Wafer进行电性能测试 挑选出好的Die 可以减少封装和测试的成本 也可以透过Wafer的良率 检查fab厂制造的工艺水平 FT测试 Final Test 芯片封装完成之后 通过分选机和测试机的配合使
  • Android 兼容8.0 App全局字体调节、禁止App字体随系统字体大小而更改

    在APP中 字体的大小单位一般会用sp 然而在改变系统字体大小时 App字体就会随着系统字体大小改变而改变 这就可能造成APP布局的错位 造成这种情况的原因是 sp单位除了受屏幕密度影响外 还受到用户的字体大小影响 通常情况下 建议使用sp