Android字体不随系统变化而变化解决方案汇总

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
    28
    import 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);
    }
    @NonNull
    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
    @Override
    protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(BaseContextWrapper.wrap(newBase));
    }

方案3 代码设置(过时)

updateConfiguration 设置会对其他Activity也有效。 createConfigurationContext 只对当前Activity有效。

  • 在Application中加入
    1
    2
    3
    4
    5
    6
    private 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
    @Override
    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);//防止系统字体大小影响布局