JessYanCoding / AndroidAutoSize

🔥 A low-cost Android screen adaptation solution (今日头条屏幕适配方案终极版,一个极低成本的 Android 屏幕适配方案).
Apache License 2.0
13.47k stars 1.96k forks source link

使用了AndroidAutoSize后,系统设置改变字体,切回App, Activity重建,但是布局文件内的字体不会自动适配改变 #447

Open moxin73 opened 1 year ago

moxin73 commented 1 year ago

Environment

Bug Description:

要求App内字体跟随系统设置字体大小改变,使用了AndroidAutoSize后,系统设置改变字体,切回App, Activity重建,但是布局文件内的字体不会自动适配改变。

手动杀死进程重启后字体就会改变了。查看了当前issues列表,没找到对应解决方案,请大神帮忙解惑

Log:

// 改变字体前日志:
The com.xxx.activity.MainActivity has been adapted!
MainActivity Info: isBaseOnWidth = true, designWidthInDp = 375.000000, designWidthInSubunits = 375.000000, targetDensity = 2.880000, targetScaledDensity = 5.760000, targetDensityDpi = 460, targetXdpi = 2.880000, targetScreenWidthDp = 375, targetScreenHeightDp = 713

 // 改变字体后日志:
MainActivity Info: isBaseOnWidth = true, designWidthInDp = 375.000000, designWidthInSubunits = 375.000000, targetDensity = 2.880000, targetScaledDensity = 5.760000, targetDensityDpi = 460, targetXdpi = 2.880000, targetScreenWidthDp = 375, targetScreenHeightDp = 713

Related Code:

  @Override
    public void onConfigurationChanged(@NonNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        AutoSize.clearCache();
        Activity activity = getTopActivity();
        if (activity != null && !activity.isFinishing() && !activity.isDestroyed()) {
            AutoSize.autoConvertDensityOfGlobal(activity);
        }
    }

Others:

JessYanCoding commented 1 year ago

看你这日志,影响字体的 targetScaledDensity 变量并没有变啊, 试试 Activity 重建前自己调用 setPrivateFontScale,是否有变化

moxin73 commented 1 year ago

看你这日志,影响字体的 targetScaledDensity 变量并没有变啊, 试试 Activity 重建前自己调用 setPrivateFontScale,是否有变化

新增了:AutoSizeConfig.getInstance().setPrivateFontScale(getSystemFontScale()); 仍然无效

JessYanCoding commented 1 year ago
    @Override
    public Resources getResources() {
        AutoSizeCompat.autoConvertDensityOfGlobal(super.getResources());//如果没有自定义需求用这个方法
        AutoSizeCompat.autoConvertDensity(super.getResources(), 667, false);//如果有自定义需求就用这个方法
        return super.getResources();
    }

加上 getResources 试试。

moxin73 commented 1 year ago
    @Override
    public Resources getResources() {
        AutoSizeCompat.autoConvertDensityOfGlobal(super.getResources());//如果没有自定义需求用这个方法
        AutoSizeCompat.autoConvertDensity(super.getResources(), 667, false);//如果有自定义需求就用这个方法
        return super.getResources();
    }

加上 getResources 试试。

感谢大神,好使了,最终解决方案:

Application中:

    @Override
    public void onConfigurationChanged(@NonNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (isFontScaleChanged()) {
            AutoSizeCompat.clearCache();
        }
    }

BaseActivity 中:

    @Override
    public Resources getResources() {
        AutoSizeConfig.getInstance().privateFontScale = getSystemFontScale()
         AutoSizeCompat.autoConvertDensityOfGlobal(resources)
        return super.getResources()
    }

这样就能自行改变适配了