Android 禁止App字体随系统大小而更改

运营反馈,老年用户的手机多设置为大字体,在使用我们app过程中,由于字体被放大,导致布局错乱,部分功能按键遮挡,无法正常使用。

收到问题,着手解决,除了对界面布局进行改写,改为约束布局,对app字体大小也进行统一管理,然而这不是主要的,最主要的是避免系统更改app字体的大小。

Android提供了相关的方法用来实现

复制代码
 public class DisplayUtil {
        /**
         * 保持字体大小不随系统设置变化(用在界面加载之前)
         * 要重写Activity的attachBaseContext()
         */
        public static Context attachBaseContext(Context context, float fontScale) {
            Configuration config = context.getResources().getConfiguration();
            //正确写法
            config.fontScale = fontScale;
            return context.createConfigurationContext(config);
        }

        /**
         * 保持字体大小不随系统设置变化(用在界面加载之前)
         * 要重写Activity的getResources()
         */
        public static Resources getResources(Context context, Resources resources, float fontScale) {
            Configuration config = resources.getConfiguration();
            if(config.fontScale != fontScale) {
                config.fontScale = fontScale;
                return context.createConfigurationContext(config).getResources();
            } else {
                return resources;
            }
        }

        /**
         * 保存字体大小,后通知界面重建,它会触发attachBaseContext,来改变字号
         */
        public static void recreate(Activity activity) {
            activity.recreate();
        }
}

在BaseActivity中复写相关的方法:

复制代码
 static float fontScale = 1f;

    @Override
    public Resources getResources() {
        Resources resources = super.getResources();
        return DisplayUtil.getResources(this,resources,fontScale);
    }

    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(DisplayUtil.attachBaseContext(newBase,fontScale));
    }
    
    public void setFontScale(float fontScale) {
        this.fontScale = fontScale;
        DisplayUtil.recreate(this);
    }

经测试,在设置中把字体调整为最大,打开app,app中字体均保持不变,测试华为,vivo,小米机型均生效,于是交付测试。

相关推荐
tangweiguo0305198722 分钟前
Android BottomNavigationView 完全自定义指南:图标、文字颜色与选中状态
android
遥不可及zzz1 小时前
Android 应用程序包的 adb 命令
android·adb
无知的前端2 小时前
Flutter 一文精通Isolate,使用场景以及示例
android·flutter·性能优化
_一条咸鱼_2 小时前
Android Compose 入门之字符串与本地化深入剖析(五十三)
android
ModestCoder_3 小时前
将一个新的机器人模型导入最新版isaacLab进行训练(以unitree H1_2为例)
android·java·机器人
robin_suli3 小时前
Spring事务的传播机制
android·java·spring
鸿蒙布道师4 小时前
鸿蒙NEXT开发对象工具类(TS)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
Harrison_zhu5 小时前
Ubuntu18.04 编译 Android7.1代码报错
android
CYRUS STUDIO7 小时前
Unidbg Trace 反 OLLVM 控制流平坦化(fla)
android·汇编·算法·网络安全·逆向·ollvm
扫地的小何尚8 小时前
NVIDIA工业设施数字孪生中的机器人模拟
android·java·c++·链表·语言模型·机器人·gpu