运营反馈,老年用户的手机多设置为大字体,在使用我们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;@Overridepublic Resources getResources() {Resources resources = super.getResources();return DisplayUtil.getResources(this,resources,fontScale);}@Overrideprotected void attachBaseContext(Context newBase) {super.attachBaseContext(DisplayUtil.attachBaseContext(newBase,fontScale));}public void setFontScale(float fontScale) {this.fontScale = fontScale;DisplayUtil.recreate(this);}
经测试,在设置中把字体调整为最大,打开app,app中字体均保持不变,测试华为,vivo,小米机型均生效,于是交付测试。