AndroidAutoSize icon indicating copy to clipboard operation
AndroidAutoSize copied to clipboard

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

Open moxin73 opened this issue 1 year ago • 4 comments

Environment

  • [x] Autosize Version: 最新源码引入
  • [x] Target Android Version: Android 12
  • [x] Device Model: 三星 SM-N9860
  • [x] Device Resolution: 1080px * 1920px
  • [x] Design Size On AndroidManifest: 375dp * 812dp

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:

moxin73 avatar Aug 02 '23 07:08 moxin73

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

JessYanCoding avatar Aug 02 '23 10:08 JessYanCoding

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

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

moxin73 avatar Aug 02 '23 12:08 moxin73

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

加上 getResources 试试。

JessYanCoding avatar Aug 03 '23 01:08 JessYanCoding

    @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()
    }

这样就能自行改变适配了

moxin73 avatar Aug 03 '23 08:08 moxin73