AndroidAutoSize
AndroidAutoSize copied to clipboard
Activity的方向是横屏的,手机方向竖屏,进入Activity的时候会加载网络数据延迟来绘制UI,如果进入Activity的瞬间应用缩小到后台,这时候会出现适配失效的bug。
Environment
- [x] Autosize Version:
- [x] Target Android Version:
- [x] Device Model:
- [x] Device Resolution:
- [x] Design Size On AndroidManifest:
Bug Description:
Log:
Screenshot
Related Code:
Others:
AutoSizeConfig的onConfigurationChanged回调时计算的宽高与实际屏幕方向的宽高对调了。
https://github.com/JessYanCoding/AndroidAutoSize/blob/master/demo/src/main/java/me/jessyan/autosize/demo/BaseApplication.java#L84
按照你的逻辑,自己改下屏幕的高宽
我试过了这个方法去设置了的,还是一样存在这个问题。旋转屏幕如果正好在绘制UI,就会出现上述的问题。
你就屏幕旋转完,设置好正确的屏幕尺寸在绘制ui。
你就屏幕旋转完,设置好正确的屏幕尺寸在绘制ui。
如果在一个横屏页面给上一个竖屏页面发消息弹dialog,这时候是这个dialog显示是不正确的。。场景和业务只能是横屏给发,不能竖屏检查。。
横屏,设置高度为375,然后去微信分享,再取消回来,也会适配失效。toast都没法正常显示了,dialog也一样
不用旋转也是会出现这类情况,常驻后台一天 在应用不被杀死的情况 进入应用 整个都ui都失效了
上面说的所有问题,都是在 UI 显示之前,density未能正确切换成期望的值,导致适配失效,框架只会在 Activity setContentview 之前,重新计算并且设置 density,其他所有的未知的业务流程,都需要你自己在 UI 显示之前重新计算并设置一个你期望的 density,比如上面所说进入后台后,再回到前台,App 会在什么时候回到前台,框架并不知道,而 density 是整个进程公有的,所以在回到前台前并不保证它的值没被其他代码所修改,所以这里需要你自己去设置一个正确的值,再刷新 UI。
所有原理包括出现问题的原因,都在 这里 讲的很清楚。
BaseActivity 重写下就搞定了,怎么转、怎么测试都没事。
override fun getResources(): Resources {
if (Looper.getMainLooper().thread == Thread.currentThread()) AutoSizeCompat.autoConvertDensity(
super.getResources(), 1024f, AutoSizeConfig.getInstance().screenWidth > AutoSizeConfig.getInstance().screenHeight
)
return super.getResources()
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) AutoSize.autoConvertDensity(this, 1024f, true)
}
BaseActivity 重写下就搞定了,怎么转、怎么测试都没事。
override fun getResources(): Resources { if (Looper.getMainLooper().thread == Thread.currentThread()) AutoSizeCompat.autoConvertDensity( super.getResources(), 1024f, AutoSizeConfig.getInstance().screenWidth > AutoSizeConfig.getInstance().screenHeight ) return super.getResources() } override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) AutoSize.autoConvertDensity(this, 1024f, true) }
我这样写 还真测出事了
BaseActivity 重写下就搞定了,怎么转、怎么测试都没事。
override fun getResources(): Resources { if (Looper.getMainLooper().thread == Thread.currentThread()) AutoSizeCompat.autoConvertDensity( super.getResources(), 1024f, AutoSizeConfig.getInstance().screenWidth > AutoSizeConfig.getInstance().screenHeight ) return super.getResources() } override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) AutoSize.autoConvertDensity(this, 1024f, true) }
可以的,有用