-
Notifications
You must be signed in to change notification settings - Fork 2k
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
JessYan: 今日头条屏幕适配方案常见问题汇总,提问前必看! #13
Comments
补充一个, 假设 Design Size On AndroidManifest 是 667 * 375, 需横屏 Activity 进入竖屏 Activity, 但是竖屏 Activity 布局异常(过大), 那么在竖屏 Activity 的 onCreateView (不是 onCreate )里补充 |
为了保证其他使用者阅读常见问题时的阅读质量,这里不允许随便留言,只允许留言带有解决方案的 AndroidAutoSize 或 今日头条屏幕适配方案的问题,有什么有疑问,请重新开启新的 Issues,并按规则完善 Issues 信息,否则留言会被删除! |
@GSEVE 有问题就提新 Issues,或者在 意见收集区 中留言,上面已经写了这里只接受问题和解决方案的留言,其他留言都会被删除 @xiaoxiaScut 你提的 issues 已经回复你了,这里不允许留言与解决方案无关的留言 |
项目是平板项目,UI图是1920px*1200px,横屏显示,所有的Activity都在清单文件中限制为横屏了,我在HUAWEI T1-823L平板上,一切正常,当屏幕进入熄屏状态后,再恢复,发现平板有一个由竖屏切换到横屏的过程,我的布局是ListView嵌套ListView,被嵌套的那层ListView的item布局,发现它适配失效了,这个有解决的参考吗 |
什么时候支持androidX |
@JasonYinH 一直都支持,框架做了 support 和 AndroidX 的 兼容处理,如果项目依赖 support 就使用 support,如果依赖 AndroidX 就使用 AndroidX |
在小米中的ListView 不管加啥 都会错位 |
main (native): tid=1 systid=20891 |
这是来自QQ邮箱的动回复邮件。
您好,你的邮件已成功接收。
|
感谢,usb插拔造成的适配失效,通过上面的方法得到解决 |
这是来自QQ邮箱的动回复邮件。
您好,你的邮件已成功接收。
|
针对双屏异显,搞了个工具类替换 Presentation 后,可以使双屏异显支持该屏幕适配方案 Java 版本:SecondaryDisplayHelper.java |
这是来自QQ邮箱的动回复邮件。
您好,你的邮件已成功接收。
|
这是来自QQ邮箱的动回复邮件。
您好,你的邮件已成功接收。
|
我目前的项目是个老项目,我二月底集成了今日头条适配,上架到市场之后,引发了多个ANR,main (native): tid=1 systid=20891 #00 pc 0x4b4cc libc.so
#1 pc 0x1af9c0 libart.so
#2 pc 0x66a228 libart.so
#3 pc 0x66a018 libart.so
at android.content.res.AssetManager.nativeGetResourceIdentifier(Native method)
at android.content.res.AssetManager.getResourceIdentifier(AssetManager.java:791)
at android.content.res.ResourcesImpl.getIdentifier(ResourcesImpl.java:281)
at android.content.res.Resources.getIdentifier(Resources.java:2164)
at me.jessyan.autosize.utils.ScreenUtils.getStatusBarHeight(ScreenUtils.java:43)
at me.jessyan.autosize.AutoSizeConfig.init(AutoSizeConfig.java:250)
at me.jessyan.autosize.AutoSizeConfig.init(AutoSizeConfig.java:205)
at me.jessyan.autosize.InitProvider.onCreate(InitProvider.java:44)
at android.content.ContentProvider.attachInfo(ContentProvider.java:2451)
at android.content.ContentProvider.attachInfo(ContentProvider.java:2421)
at android.app.ActivityThread.installProvider(ActivityThread.java:7509)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:7032)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6921)
at android.app.ActivityThread.access$1600(ActivityThread.java:269)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2045)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:233)
at android.app.ActivityThread.main(ActivityThread.java:7959)
at java.lang.reflect.Method.invoke(Native method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:631)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:978)
这个是直接报今日头条适配的ANR错误
还有报
main (native): tid=1 systid=22251
at libcore.io.Linux.access(Native method)
at libcore.io.ForwardingOs.access(ForwardingOs.java:72)
at libcore.io.BlockGuardOs.access(BlockGuardOs.java:73)
at libcore.io.ForwardingOs.access(ForwardingOs.java:72)
at android.app.ActivityThread$AndroidOs.access(ActivityThread.java:7839)
at java.io.UnixFileSystem.checkAccess(UnixFileSystem.java:281)
at java.io.File.exists(File.java:815)
at android.app.ContextImpl.ensureExternalDirsExistOrFilter(ContextImpl.java:2875)
at android.app.ContextImpl.getExternalCacheDirs(ContextImpl.java:825)
at android.content.ContextWrapper.getExternalCacheDirs(ContextWrapper.java:308)
at androidx.core.content.ContextCompat.getExternalCacheDirs(ContextCompat.java:434)
at androidx.core.content.FileProvider.parsePathStrategy(FileProvider.java:696)
at androidx.core.content.FileProvider.getPathStrategy(FileProvider.java:635)
at androidx.core.content.FileProvider.attachInfo(FileProvider.java:416)
at android.app.ActivityThread.installProvider(ActivityThread.java:7524)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:7024)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6937)
at android.app.ActivityThread.access$1300(ActivityThread.java:263)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1991)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:240)
at android.app.ActivityThread.main(ActivityThread.java:8000)
at java.lang.reflect.Method.invoke(Native method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:603)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
经过研究发现 这两个问题是同属于同一问题导致,具体是由 今日头条的InitProvider.java:44 引发
…------------------ 原始邮件 ------------------
发件人: ***@***.***>;
发送时间: 2022年3月28日(星期一) 晚上6:01
收件人: ***@***.***>;
抄送: ***@***.***>; ***@***.***>;
主题: Re: [JessYanCoding/AndroidAutoSize] JessYan: 今日头条屏幕适配方案常见问题汇总,提问前必看! (#13)
这是来自QQ邮箱的动回复邮件。
您好,你的邮件已成功接收。
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you commented.Message ID: ***@***.***>
|
某些版本的Android11和Android12以后。会存在如下问题:
|
这是来自QQ邮箱的动回复邮件。
您好,你的邮件已成功接收。
|
这个链接并没有解决什么问题,折叠屏在平行视窗的情况下设置的density与实际的并不一样,猜测在这种情况下可能是系统篡改了density,怎么解决呢? |
这是来自QQ邮箱的动回复邮件。
您好,你的邮件已成功接收。
|
这是来自QQ邮箱的假期自动回复邮件。
您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
在这里陈列的内容是 AndroidAutoSize 框架和 今日头条屏幕适配方案 的常见 Issues 以及解决方案,如果在这里没找到您需要的答案,不妨前往 历史 Issues 碰碰运气
这里会持续更新 今日头条屏幕适配方案 的相关问题以及解决方案,如果您发现有什么重要的与 今日头条屏幕适配方案 相关的已知或未知的问题在这里未收录,都可以通过留言或者新增 Issues 的方式告知我,并不仅限于 AndroidAutoSize 框架的问题,不管您是不是使用 AndroidAutoSize 框架,我们都可以共同出力,让 今日头条屏幕适配方案 更完善、更稳定!
+ 如果你想用好 AndroidAutoSize,少出问题,请认真看完下面的所有文字,不要嫌字数长,拒绝做伸手党!!!
Tips: 今日头条适配方案的原理来源于修改 DisplayMetrics#density,因为 DisplayMetrics#density 是全局的,所以只要 DisplayMetrics#density 一经修改,项目中的所有页面、所有控件都可以奏效,包括三方库控件和系统控件,这就是今日头条屏幕适配方案天然拥有优于其他屏幕适配方案的低成本和低侵入性
但 DisplayMetrics#density 是公有的,谁都有权限修改,AndroidAutoSize 可以把 DisplayMetrics#density 修改成一个可以完成屏幕适配的值,其他三方库、Android 系统、以及项目成员就可以把 DisplayMetrics#density 修改或恢复成另一个值,这都将导致屏幕适配的失效,特别是在某些定制系统上,因为这个定制系统做的某些特殊操作都是未知的 (但 AndroidAutoSize 开源这么久,大多数系统都是很稳定的)
但这个问题 AndroidAutoSize 却无能为力,因为 DisplayMetrics#density 是公有的,AndroidAutoSize 只不过是修改 DisplayMetrics#density 中的一员,系统并没有赋予 AndroidAutoSize 可以锁死 DisplayMetrics#density 为某一特定值的权限,而只要其他代码拥有修改 DisplayMetrics#density 的权限,就有不稳定性的产生
所以该问题目前唯一的解决方案就是确保在页面显示到屏幕上的 0.0000000000000000000000000001 秒之前,将 DisplayMetrics#density 修改为期望的值,哪怕页面显示完的后一秒,DisplayMetrics#density 又被修改为其他值,只要这个页面不重建,就不会影响已经显示了的页面,也就是下面的第一个解决方案
+ 以下内容是大部分 issues 出现的核心原因,本框架上手容易,但是要想真正的驾驭,需要熟悉其中的原理!
由于 DisplayMetrics#density 在整个 Application 中是公有并且唯一的,所以并不存在在每一个 Activity 或者 Fragment 中都拥有一个独立的 DisplayMetrics#density,框架之所以能实现每个 Activity 或 Fragment 都可以拥有不同的设计图尺寸,是因为框架自动在每个 Activity 或 Fragment 显示 UI 之前将 DisplayMetrics#density 更改为了它期望的正确值,但是框架并不知道项目中的每个 UI 需要显示或更新到屏幕上的正确时机,只是默认在 setContentView() 之前修改了 DisplayMetrics#density,但在实际开发中,业务何其复杂,有些时候 UI 的显示或更新并不只局限于 setContentView(),比如说在某些业务中会出现一些自定义事件触发自定义 View 进行 requestLayout() 、invalidate() ,或者 RecyclerView 在某些时机需要再次更新 Item 中的内容,但要注意的是,在所有会影响 UI 显示的方法之前都应该保证 DisplayMetrics#density 切换到正确的值,如果框架在你的自定义事件中并未在 UI 显示或更新前将 DisplayMetrics#density 设置为期望的值,就会出现屏幕适配异常的问题,请你辅助框架在 UI 显示或更新之前调用 AutoSize 中的方法,将 DisplayMetrics#density 更改为期望的值。
但如果你对框架原理不是非常熟悉,请不要频繁的更改 DisplayMetrics#density(更改设计图尺寸,以及横竖屏切换都会导致 DisplayMetrics#density 的更改),如果又不懂原理,又喜欢更改 DisplayMetrics#density,那就有一定概率出现你们经常在 issues 中提到的一些屏幕适配失效或者异常的问题,这有很大概率是因为你们自己不懂原理又瞎鸡巴乱搞导致的!出现这个问题的原因就是因为更改 DisplayMetrics#density 后导致期望的 DisplayMetrics#density 与实际的 DisplayMetrics#density 不一致,什么叫懂原理?请把 骚年你的屏幕适配方式该升级了! 系列文章都看一遍,再认真看下 AndroidAutoSize 中核心类的源码,别问我核心类是哪些,问就是全部!
一般情况下,下面的 万能解决方案 就能解决大部分的问题,因为在每个与 UI 相关的方法执行时,都会调用 getResources() 方法, 但这个解决方案只能保证一个 Activity 只存在一个设计图尺寸,如果你的一个 Activity 出现了多个设计图尺寸,比如说嵌入了系统 View、第三方 View (系统 View 或第三方 View 的设计图尺寸有很大概率和你项目的设计图尺寸不一致)或者不同设计图尺寸的 Fragment,那这个 万能解决方案 也不能解决所有问题。
The text was updated successfully, but these errors were encountered: