Android 解决字体随系统调节而变化的问题,方法汇总
非WebView处理
方案1【使用dp替换sp】
sp和dp很类似但唯一的区别是,Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等),
当文字尺寸是“正常”时1sp=1dp=0.00625英寸,而当文字尺寸是“大”或“超大”时,1sp>1dp=0.00625英寸。
方案2【代码设置(新)】
新建类BaseContextWrapper
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28import android.content.Context;
import android.content.ContextWrapper;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.support.annotation.NonNull;
import android.util.DisplayMetrics;
public class BaseContextWrapper extends ContextWrapper {
public BaseContextWrapper(Context base) {
super(base);
}
public static ContextWrapper wrap(Context context) {
Resources resources = context.getResources();
Configuration newConfig = new Configuration();
DisplayMetrics metrics = resources.getDisplayMetrics();
newConfig.setToDefaults();
//如果没有设置densityDpi, createConfigurationContext对字体大小设置限制无效
newConfig.densityDpi = metrics.densityDpi;
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR1) {
context = context.createConfigurationContext(newConfig);
} else {
resources.updateConfiguration(newConfig, resources.getDisplayMetrics());
}
return new BaseContextWrapper(context);
}
}在所有Activity的基类(BaseActivity)添加
1
2
3
4
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(BaseContextWrapper.wrap(newBase));
}
方案3 代码设置(过时)
updateConfiguration 设置会对其他Activity也有效。 createConfigurationContext 只对当前Activity有效。
- 在Application中加入
1
2
3
4
5
6private void setTextDefault() {
Resources res = super.getResources();
Configuration config = new Configuration();
config.setToDefaults();
res.updateConfiguration(config, res.getDisplayMetrics());
}
缺点:如果home出来,更改了字体大小,字体还是会改变。完全退出应用在进去,字体才会改为默认大小。
- 在所有Activity 中加入,改变字体大小能及时还原默认大小。
1
2
3
4
5
6
7
8
9
10
public Resources getResources() {
Resources resources = super.getResources();
if (resources.getConfiguration().fontScale != 1) {
Configuration newConfig = new Configuration();
newConfig.setToDefaults();
resources.updateConfiguration(newConfig, resources.getDisplayMetrics());
}
return resources;
}
WebView处理
显示html 字体大小不随系统变化
1 | webSettings.setTextZoom(100);//防止系统字体大小影响布局 |