AndroidAutoSize
AndroidAutoSize copied to clipboard
横竖屏切换 布局异常~问题所在及解决方案
将Activity从竖屏页面切换至横屏页面,此时 弹出对话框布局异常,或者将app切换到后台,在切回前台时,退出横屏,此时会发现 竖屏界面 异常,部分字体偏大。 参考了#248 #44 #213 等issues都无法处理自己的问题
后续经过debug及文档的查看,发现了问题所在。 1.AutoSizeConfig的init内 注册了 application配置发生变更的监听(横竖屏切换会触发该监听),经测试,在部分手机下(华为比较容易复现)由横屏切换至竖屏的时候,ScreenUtils.getScreenSize(application) 获取到的宽高有误(在系统切换横竖屏时,此时立马去获取 WindowManager 的宽高,小概率获取到的还是之前的宽高,并不是切换之后的宽高),而在这种情况下去 赋值本地的 mScreenWidth,mScreenHeight就会导致后续布局异常 2.由于在registerComponentCallbacks 回调内只做了 宽高变量的赋值,这样就会导致 app切换为横屏,虽然本地的宽高变量发生了变更,但是 Density 还是竖屏的,所以如果在切换为横屏时,此时弹出 dialog 那么布局就会出现异常
经测试,已解决了自己的问题 解决方案如下: 在自己的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() {
}
});
有个问题,我做折叠屏还是横竖屏适配的时候,也注册了这个监听,然后在谷歌nexus手机上,发现向application注册的这个监听没有回调,你可以找台手机确认下
一些折叠屏屏幕开合后,也会出现同样的问题,导致缓存了错误的屏幕数据。
“ScreenUtils.getScreenSize(application) 获取到的宽高有误(在系统切换横竖屏时,此时立马去获取 WindowManager 的宽高,小概率获取到的还是之前的宽高,并不是切换之后的宽高”,折叠屏开到闭,必现此问题哈哈
請問有解嗎
請問有解嗎
https://blog.csdn.net/weixin_38702864/article/details/127071799 我在博客总结了下,可以看看。