AndroidAutoSize icon indicating copy to clipboard operation
AndroidAutoSize copied to clipboard

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

Open smileToWxm opened this issue 2 years ago • 7 comments

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

smileToWxm avatar Dec 27 '21 05:12 smileToWxm

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

smileToWxm avatar Dec 27 '21 06:12 smileToWxm

经测试,已解决了自己的问题 解决方案如下: 在自己的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() {

        }
    });

smileToWxm avatar Dec 27 '21 06:12 smileToWxm

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

fengx123 avatar May 13 '22 08:05 fengx123

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

yiwanwanwan avatar Aug 09 '22 07:08 yiwanwanwan

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

yiwanwanwan avatar Aug 09 '22 07:08 yiwanwanwan

請問有解嗎

FongMi avatar Feb 16 '23 16:02 FongMi

請問有解嗎

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

yiwanwanwan avatar Feb 17 '23 05:02 yiwanwanwan