Skip to content

从竖屏切换横屏,然后home键后台返回后部分view尺寸异常 #248

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
ghost opened this issue Dec 11, 2019 · 12 comments
Closed

Comments

@ghost
Copy link

ghost commented Dec 11, 2019

如题,已查看相关文档,尝试数种方法不得解决,恳请诸位救我一命QAQ

@ghost
Copy link
Author

ghost commented Dec 12, 2019

竖屏-》横屏-》切到后台-》切回

@ghost
Copy link
Author

ghost commented Dec 12, 2019

已解决,最终解决方式:
activity实现CustomAdapt

@Override
public boolean isBaseOnWidth() {
    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        return true;//根据宽度适配
    } else {
        return false;//根据高度适配
    }
}

@Override
public float getSizeInDp() {
 // 横屏下的高度不就是竖屏的宽度吗,所以统一返回宽度即可
    return 420;
}

因为是横竖屏切换,不同状态对应宽度不一样,所以要判断屏幕方向来挑选适配方法(根据宽度或者高度适配),这样的话只要在以上两个方法返回不同适配的方式,并且都返回相同的值,则都会以420dip作为高度或者宽度进行适配。(太难了我)

@majunm
Copy link

majunm commented Oct 20, 2020

已解决,最终解决方式:
activity实现CustomAdapt

@Override
public boolean isBaseOnWidth() {
    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        return true;//根据宽度适配
    } else {
        return false;//根据高度适配
    }
}

@Override
public float getSizeInDp() {
 // 横屏下的高度不就是竖屏的宽度吗,所以统一返回宽度即可
    return 420;
}

因为是横竖屏切换,不同状态对应宽度不一样,所以要判断屏幕方向来挑选适配方法(根据宽度或者高度适配),这样的话只要在以上两个方法返回不同适配的方式,并且都返回相同的值,则都会以420dip作为高度或者宽度进行适配。(太难了我)

我这样写并不能解决问题 ,太难了,.....

@linyuesheng123
Copy link

已解决,最终解决方式:
activity实现CustomAdapt

@Override
public boolean isBaseOnWidth() {
    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        return true;//根据宽度适配
    } else {
        return false;//根据高度适配
    }
}

@Override
public float getSizeInDp() {
 // 横屏下的高度不就是竖屏的宽度吗,所以统一返回宽度即可
    return 420;
}

因为是横竖屏切换,不同状态对应宽度不一样,所以要判断屏幕方向来挑选适配方法(根据宽度或者高度适配),这样的话只要在以上两个方法返回不同适配的方式,并且都返回相同的值,则都会以420dip作为高度或者宽度进行适配。(太难了我)

我这样写并不能解决问题 ,太难了,.....

为什么其他人都没遇到这种问题啊,横屏应用,解锁的时候,先横再竖再横,然后 RecyclerView 很容易出问题,搞了好几天了,都没解决。搜了好久,也尝试了好久。。

在 onCreateView , onBindViewHolder, onConfigurationChanged, getResources, onResume 里面,这些都试过了。。
好难啊

@majunm
Copy link

majunm commented Nov 6, 2020

已解决,最终解决方式:
activity实现CustomAdapt

@Override
public boolean isBaseOnWidth() {
    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        return true;//根据宽度适配
    } else {
        return false;//根据高度适配
    }
}

@Override
public float getSizeInDp() {
 // 横屏下的高度不就是竖屏的宽度吗,所以统一返回宽度即可
    return 420;
}

因为是横竖屏切换,不同状态对应宽度不一样,所以要判断屏幕方向来挑选适配方法(根据宽度或者高度适配),这样的话只要在以上两个方法返回不同适配的方式,并且都返回相同的值,则都会以420dip作为高度或者宽度进行适配。(太难了我)

我这样写并不能解决问题 ,太难了,.....

为什么其他人都没遇到这种问题啊,横屏应用,解锁的时候,先横再竖再横,然后 RecyclerView 很容易出问题,搞了好几天了,都没解决。搜了好久,也尝试了好久。。

在 onCreateView , onBindViewHolder, onConfigurationChanged, getResources, onResume 里面,这些都试过了。。
好难啊

取消这个activity的适配 吧哈哈哈

@Moyuchen
Copy link

Moyuchen commented Nov 6, 2020

太难了,查了好多资料,没有用,按照这个方法解决了!
@OverRide
public boolean isBaseOnWidth() {
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
return true;
}else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
return false;
}else {
return false;
}
}

@Override
public float getSizeInDp() {
    return 360;
}

@zane-liucz
Copy link

zane-liucz commented Dec 9, 2020

override fun getResources(): Resources {
    //细节参照 AutoSizeCompat.autoConvertDensity方法
    val width = AutoSizeConfig.getInstance().screenWidth
    val height = AutoSizeConfig.getInstance().screenHeight
   //不根据系统提供的宽高自己计算,而是自己根据长短区分我们需要用的宽高数据来进行计算和适配
    var min = Math.min(width,height)
    val targetDensity = min * 1.0f / 800
    val resources = super.getResources()
    val targetScreenWidthDp = (AutoSizeConfig.getInstance().screenWidth / targetDensity).toInt()
    val targetScreenHeightDp = (AutoSizeConfig.getInstance().screenHeight / targetDensity).toInt()
    val densityDpi = (targetDensity * 160).toInt()
    //下面两个方法参考AutoSizeCompat的setDensity和setScreenSizeDp方法
    setDensity(resources, targetDensity, densityDpi, targetDensity)
    setScreenSizeDp(resources, targetScreenWidthDp, targetScreenHeightDp)
    return resources
}

@Equalzys
Copy link

Equalzys commented Jan 8, 2021

横屏Activity适配失效解决办法:

 @Override
    public Resources getResources() {
        //细节参照 AutoSizeCompat.autoConvertDensity方法
        int width = AutoSizeConfig.getInstance().getScreenWidth();
        int height = AutoSizeConfig.getInstance().getScreenHeight();
        //不根据系统提供的宽高自己计算,而是自己根据长短区分我们需要用的宽高数据来进行计算和适配
        int min = Math.min(width,height);
        //375为设计稿宽,根据自己设计稿填写
        float targetDensity = min * 1.0f / 375;
        Resources resources = super.getResources();
        int targetScreenWidthDp = (int) (AutoSizeConfig.getInstance().getScreenWidth() / targetDensity);
        int targetScreenHeightDp = (int) (AutoSizeConfig.getInstance().getScreenHeight() / targetDensity);
        int densityDpi = (int) (targetDensity * 160);
        //下面两个方法参考AutoSizeCompat的setDensity和setScreenSizeDp方法
        setDensity(resources, targetDensity, densityDpi, targetDensity);
        setScreenSizeDp(resources, targetScreenWidthDp, targetScreenHeightDp);
        return resources;

    }

    private void setScreenSizeDp(Resources resources, int screenWidthDp, int screenHeightDp) {
        if (AutoSizeConfig.getInstance().getUnitsManager().isSupportDP() && AutoSizeConfig.getInstance().getUnitsManager().isSupportScreenSizeDP()) {
            Configuration activityConfiguration = resources.getConfiguration();
            setScreenSizeDp(activityConfiguration, screenWidthDp, screenHeightDp);

            Configuration appConfiguration = AutoSizeConfig.getInstance().getApplication().getResources().getConfiguration();
            setScreenSizeDp(appConfiguration, screenWidthDp, screenHeightDp);
        }
    }

    private  void setScreenSizeDp(Configuration configuration, int screenWidthDp, int screenHeightDp) {
        configuration.screenWidthDp = screenWidthDp;
        configuration.screenHeightDp = screenHeightDp;
    }


    private  void setDensity(Resources resources, float density, int densityDpi, float scaledDensity) {
        float xdpi = AutoSizeConfig.getInstance().getInitXdpi();
        switch (AutoSizeConfig.getInstance().getUnitsManager().getSupportSubunits()) {
                    case PT:
                        xdpi = xdpi / 72f;
                        break;
                    case MM:
                        xdpi = xdpi / 25.4f;
                        break;
                    default:
                }
        DisplayMetrics activityDisplayMetrics = resources.getDisplayMetrics();
        setDensity(activityDisplayMetrics, density, densityDpi, scaledDensity, xdpi);
        DisplayMetrics appDisplayMetrics = AutoSizeConfig.getInstance().getApplication().getResources().getDisplayMetrics();
        setDensity(appDisplayMetrics, density, densityDpi, scaledDensity, xdpi);

        //兼容 MIUI
        DisplayMetrics activityDisplayMetricsOnMIUI = getMetricsOnMiui(resources);
        DisplayMetrics appDisplayMetricsOnMIUI = getMetricsOnMiui(AutoSizeConfig.getInstance().getApplication().getResources());

        if (activityDisplayMetricsOnMIUI != null) {
            setDensity(activityDisplayMetricsOnMIUI, density, densityDpi, scaledDensity, xdpi);
        }
        if (appDisplayMetricsOnMIUI != null) {
            setDensity(appDisplayMetricsOnMIUI, density, densityDpi, scaledDensity, xdpi);
        }
    }

    /**
     * 赋值
     *
     * @param displayMetrics {@link DisplayMetrics}
     * @param density        {@link DisplayMetrics#density}
     * @param densityDpi     {@link DisplayMetrics#densityDpi}
     * @param scaledDensity  {@link DisplayMetrics#scaledDensity}
     * @param xdpi           {@link DisplayMetrics#xdpi}
     */
    private  void setDensity(DisplayMetrics displayMetrics, float density, int densityDpi, float scaledDensity, float xdpi) {
        if (AutoSizeConfig.getInstance().getUnitsManager().isSupportDP()) {
            displayMetrics.density = density;
            displayMetrics.densityDpi = densityDpi;
        }
        if (AutoSizeConfig.getInstance().getUnitsManager().isSupportSP()) {
            displayMetrics.scaledDensity = scaledDensity;
        }
        switch (AutoSizeConfig.getInstance().getUnitsManager().getSupportSubunits()) {
            case NONE:
                break;
            case PT:
                displayMetrics.xdpi = xdpi * 72f;
                break;
            case IN:
                displayMetrics.xdpi = xdpi;
                break;
            case MM:
                displayMetrics.xdpi = xdpi * 25.4f;
                break;
            default:
        }
    }

    private  DisplayMetrics getMetricsOnMiui(Resources resources) {
        if (AutoSizeConfig.getInstance().isMiui() && AutoSizeConfig.getInstance().getTmpMetricsField() != null) {
            try {
                return (DisplayMetrics) AutoSizeConfig.getInstance().getTmpMetricsField().get(resources);
            } catch (Exception e) {
                return null;
            }
        }
        return null;
    }

@tangfuOK
Copy link

我出现问题的场景:横屏应用,锁屏时系统变为竖屏,在后台切换fragment,并更新了UI,再解锁,出现适配异常的情况。
我使用@W252016021 的方法并没有解决问题,有时会出现UI适配异常的情况,猜测是因为快速的判断是否是竖屏 和 库中的方法异步了。
使用 @Equalzys 的方法能够解决问题。
但我使用了一个更简便的方法解决了问题。

在Activity中


 @Override
    public Resources getResources() {
        //需要升级到 v1.1.2 及以上版本才能使用 AutoSizeCompat
        int width = AutoSizeConfig.getInstance().getScreenWidth();
        int height = AutoSizeConfig.getInstance().getScreenHeight();
        AutoSizeCompat.autoConvertDensity(super.getResources(), 961, width > height);
        return super.getResources();
    }


@xuzh2017
Copy link

我出现问题的场景:横屏应用,锁屏时系统变为竖屏,在后台切换fragment,并更新了UI,再解锁,出现适配异常的情况。
我使用@W252016021 的方法并没有解决问题,有时会出现UI适配异常的情况,猜测是因为快速的判断是否是竖屏 和 库中的方法异步了。
使用 @Equalzys 的方法能够解决问题。
但我使用了一个更简便的方法解决了问题。

在Activity中


 @Override
    public Resources getResources() {
        //需要升级到 v1.1.2 及以上版本才能使用 AutoSizeCompat
        int width = AutoSizeConfig.getInstance().getScreenWidth();
        int height = AutoSizeConfig.getInstance().getScreenHeight();
        AutoSizeCompat.autoConvertDensity(super.getResources(), 961, width > height);
        return super.getResources();
    }

这个不会有线程异常吗?

@JessYanCoding
Copy link
Owner

@xuzh2017 可能会,#359

@ysj40540
Copy link

ysj40540 commented Dec 1, 2022

isSupportDP

已解决,最终解决方式:
activity实现CustomAdapt

@Override
public boolean isBaseOnWidth() {
    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        return true;//根据宽度适配
    } else {
        return false;//根据高度适配
    }
}

@Override
public float getSizeInDp() {
 // 横屏下的高度不就是竖屏的宽度吗,所以统一返回宽度即可
    return 420;
}

因为是横竖屏切换,不同状态对应宽度不一样,所以要判断屏幕方向来挑选适配方法(根据宽度或者高度适配),这样的话只要在以上两个方法返回不同适配的方式,并且都返回相同的值,则都会以420dip作为高度或者宽度进行适配。(太难了我)

我这样写并不能解决问题 ,太难了,.....

为什么其他人都没遇到这种问题啊,横屏应用,解锁的时候,先横再竖再横,然后 RecyclerView 很容易出问题,搞了好几天了,都没解决。搜了好久,也尝试了好久。。

在 onCreateView , onBindViewHolder, onConfigurationChanged, getResources, onResume 里面,这些都试过了。。 好难啊

一样遇到了,解决了吗

This issue was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

9 participants