Skip to content

横竖屏切换 布局异常~问题所在及解决方案 #388

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

Open
smileToWxm opened this issue Dec 27, 2021 · 7 comments
Open

横竖屏切换 布局异常~问题所在及解决方案 #388

smileToWxm opened this issue Dec 27, 2021 · 7 comments

Comments

@smileToWxm
Copy link

将Activity从竖屏页面切换至横屏页面,此时 弹出对话框布局异常,或者将app切换到后台,在切回前台时,退出横屏,此时会发现 竖屏界面 异常,部分字体偏大。
参考了#248 #44 #213 等issues都无法处理自己的问题

@smileToWxm
Copy link
Author

后续经过debug及文档的查看,发现了问题所在。
1.AutoSizeConfig的init内 注册了 application配置发生变更的监听(横竖屏切换会触发该监听),经测试,在部分手机下(华为比较容易复现)由横屏切换至竖屏的时候,ScreenUtils.getScreenSize(application) 获取到的宽高有误(在系统切换横竖屏时,此时立马去获取 WindowManager 的宽高,小概率获取到的还是之前的宽高,并不是切换之后的宽高),而在这种情况下去 赋值本地的 mScreenWidth,mScreenHeight就会导致后续布局异常
2.由于在registerComponentCallbacks 回调内只做了 宽高变量的赋值,这样就会导致 app切换为横屏,虽然本地的宽高变量发生了变更,但是 Density 还是竖屏的,所以如果在切换为横屏时,此时弹出 dialog 那么布局就会出现异常

@smileToWxm
Copy link
Author

经测试,已解决了自己的问题
解决方案如下:
在自己的application 也注册 配置变更监听,在触发之后,设置 延时(我这里是设置500毫秒,可以根据自己去更改),再去重新设置 AutoSizeConfig内的变量,并重新调用 autoConvertDensityOfGlobal 去设置 Density
代码如下

    registerComponentCallbacks(new ComponentCallbacks() {
        @Override
        public void onConfigurationChanged(@NonNull Configuration newConfig) {

            //设置延时500,因为在配置发生变更的时候 立即去获取 屏幕宽高,有时候会出现获取参数不正确的情况,
            //比如横屏切换竖屏,可能会获取到 横屏的宽高,所以这里 设置延时,重新赋值 横竖屏的宽高,然后在重新设置dpi
            MtimeUtils.interva(500, 1, 1, new ITimeListener() {
                @Override
                public void onDisposable(Disposable disposable, Object tag) { }
                @Override
                public void onTime(long time, Object tag) {

                    //获取当前屏幕的宽高
                    int[] screenSize = ScreenUtils.getScreenSize(sAppContext);

                    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
                        //竖屏
                        AutoSizeConfig.getInstance().setScreenWidth(screenSize[0]);
                        AutoSizeConfig.getInstance().setScreenHeight(screenSize[1]);

                    } else {
                        //横屏下需要 转换 宽高的值
                        AutoSizeConfig.getInstance().setScreenWidth(screenSize[1]);
                        AutoSizeConfig.getInstance().setScreenHeight(screenSize[0]);

                    }

                    //重新设置 dpi
                    AutoSize.autoConvertDensityOfGlobal(AppManager.getAppManager().currentActivity());
                    KLog.e("AndroidAutoSize", "......   " + AutoSizeConfig.getInstance().getScreenHeight() + "   " + AutoSizeConfig.getInstance().getScreenWidth() + "  \n ");
                }
            });
        }

        @Override
        public void onLowMemory() {

        }
    });

@fengx123
Copy link

有个问题,我做折叠屏还是横竖屏适配的时候,也注册了这个监听,然后在谷歌nexus手机上,发现向application注册的这个监听没有回调,你可以找台手机确认下

@yiwanwanwan
Copy link

一些折叠屏屏幕开合后,也会出现同样的问题,导致缓存了错误的屏幕数据。

@yiwanwanwan
Copy link

“ScreenUtils.getScreenSize(application) 获取到的宽高有误(在系统切换横竖屏时,此时立马去获取 WindowManager 的宽高,小概率获取到的还是之前的宽高,并不是切换之后的宽高”,折叠屏开到闭,必现此问题哈哈

@FongMi
Copy link

FongMi commented Feb 16, 2023

請問有解嗎

@yiwanwanwan
Copy link

請問有解嗎

https://blog.csdn.net/weixin_38702864/article/details/127071799
我在博客总结了下,可以看看。

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

4 participants