阻止系统字体大小影响Android应用:一加13设备适配失效问题求助
阻止系统字体大小影响Android应用:一加13设备适配失效问题求助
我最近在做应用字体缩放固定的适配,用下面这段代码来强制应用不受系统字体大小设置的影响,在小米、华为、三星这些绝大多数设备上都跑的好好的,但唯独在一加13上完全没效果,字体还是会跟着系统设置变。我怀疑是不是一加的系统做了什么限制,把我修改的配置给覆盖了?
override fun attachBaseContext(newBase: Context) { val config = newBase.resources.configuration config.fontScale = 1.0f config.densityDpi = DisplayMetrics.DENSITY_DEVICE_STABLE val adjustedContext = newBase.createConfigurationContext(config) super.attachBaseContext(adjustedContext) }
下面是几个可能的排查方向和解决思路,你可以试试:
- 一加13搭载的ColorOS大概率对系统配置修改做了优先级更高的全局拦截,尤其是字体缩放这类和用户体验强相关的设置。你可以试试在
onConfigurationChanged方法里也加上配置重置的逻辑,因为有些设备会在应用启动后或者切换状态时重新加载系统配置,覆盖你之前的修改:override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) val fixedConfig = newConfig.copy() fixedConfig.fontScale = 1.0f fixedConfig.densityDpi = DisplayMetrics.DENSITY_DEVICE_STABLE resources.updateConfiguration(fixedConfig, resources.displayMetrics) } - 从Android 14开始,系统对
configuration.fontScale的修改权限收紧了不少,一加13应该是基于Android 14的ColorOS,可能系统层面强制要求应用遵循系统字体设置。你可以换一种方式,直接修改DisplayMetrics的scaledDensity值,这个是直接控制字体缩放的核心参数:override fun attachBaseContext(newBase: Context) { super.attachBaseContext(newBase) val metrics = resources.displayMetrics // 直接把scaledDensity和density绑定,固定缩放比例为1.0 metrics.scaledDensity = metrics.density * 1.0f metrics.densityDpi = DisplayMetrics.DENSITY_DEVICE_STABLE } - 去一加13的系统设置里找找有没有「应用字体独立控制」这类选项,有些厂商会给用户提供“强制所有应用跟随系统字体”的开关,如果这个开关是打开的,那你的应用修改配置的操作就会被系统拦截掉。
- 实在不行的话,还有个兜底方案:把布局文件里所有用
sp单位的字体大小换成dp,这样字体大小就完全和密度绑定,不受系统字体缩放影响了,不过这个方法比较繁琐,而且会失去字体缩放的灵活性,只适合必须完全固定字体的场景。
你可以先按上面的顺序试试,先查系统设置,再补全配置变化的拦截逻辑,最后考虑兜底方案,应该能解决一加13上的问题。
内容来源于stack exchange




