You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

阻止系统字体大小影响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,可能系统层面强制要求应用遵循系统字体设置。你可以换一种方式,直接修改DisplayMetricsscaledDensity值,这个是直接控制字体缩放的核心参数:
    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

火山引擎 最新活动