JessYanCoding / AndroidAutoSize

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

androidautosize完全没有效果,但是日志显示Density适配成功。 #354

Closed zhuzhushang closed 3 years ago

zhuzhushang commented 3 years ago

日志

2021-04-30 15:30:38.098 30061-30061/com.noahedu.learnstore D/AndroidAutoSize: com.noahedu.learnstore.framework.subact.MainActivity used the global configuration.
2021-04-30 15:30:38.100 30061-30061/com.noahedu.learnstore D/AndroidAutoSize: The com.noahedu.learnstore.framework.subact.MainActivity has been adapted! 
    MainActivity Info: isBaseOnWidth = true, designWidthInDp = 768.000000, designWidthInSubunits = 768.000000, targetDensity = 2.083333, targetScaledDensity = 2.083333, targetDensityDpi = 333, targetXdpi = 2.083333, targetScreenWidthDp = 768, targetScreenHeightDp = 986

原本只是以为有地方给density重新赋值了,于是全局搜索给density赋值的地方,结果没有发现。 无意间看到baseactivity重写了getResource方法,发现这段代码也可以density重新赋值。凌乱...

    @Override
    public Resources getResources() {
        Resources res = super.getResources();
        Configuration config = new Configuration();
        config.setToDefaults();
        res.updateConfiguration(config, res.getDisplayMetrics());
        return res;
    }

    /**
     * Set this object to the system defaults. Configuration类构造会调用此方法
     */
    public void setToDefaults() {
        fontScale = 1;
        mcc = mnc = 0;
        mLocaleList = LocaleList.getEmptyLocaleList();
        locale = null;
        userSetLocale = false;
        touchscreen = TOUCHSCREEN_UNDEFINED;
        keyboard = KEYBOARD_UNDEFINED;
        keyboardHidden = KEYBOARDHIDDEN_UNDEFINED;
        hardKeyboardHidden = HARDKEYBOARDHIDDEN_UNDEFINED;
        navigation = NAVIGATION_UNDEFINED;
        navigationHidden = NAVIGATIONHIDDEN_UNDEFINED;
        orientation = ORIENTATION_UNDEFINED;
        screenLayout = SCREENLAYOUT_UNDEFINED;
        colorMode = COLOR_MODE_UNDEFINED;
        uiMode = UI_MODE_TYPE_UNDEFINED;
        screenWidthDp = compatScreenWidthDp = SCREEN_WIDTH_DP_UNDEFINED;
        screenHeightDp = compatScreenHeightDp = SCREEN_HEIGHT_DP_UNDEFINED;
        smallestScreenWidthDp = compatSmallestScreenWidthDp = SMALLEST_SCREEN_WIDTH_DP_UNDEFINED;
        densityDpi = DENSITY_DPI_UNDEFINED;
        assetsSeq = ASSETS_SEQ_UNDEFINED;
        seq = 0;
        windowConfiguration.setToDefaults();
    }

所以autosize不生效,可以看下是不是这个方法改变的,举一反三。

另外使用generateLayoutParams也可以生效,就是改动地方太多,不考虑。

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