运营反馈,老年用户的手机多设置为大字体,在使用我们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,小米机型均生效,于是交付测试。
作者:雨落川川
链接:https://www.jianshu.com/p/c4944ea4b85f