Android的哪个部分负责选择正确的资源配置文件?

Sha*_*ark 8 android android-layout android-resolution android-resources

我有一个奇怪的问题.

在你想出我的想法之前,我正在研究一个定制的果冻豆.因此,"通常很好的方法"可能在这里不起作用,并且必须进行肮脏的解决方法.

我有一个APK,其中包含以下资产:

layout
layout-mdpi
layout-land
layout-large-mdpi
layout-large-land-mdpi
layout-large-hdpi
layout-large-xhdpi
Run Code Online (Sandbox Code Playgroud)

其他一些指标代码返回了这个:

D/AppDemo( 2091): measured width: 1920 PE width: 1920 scaleFactor = 1.0
D/AppDemo( 2091): [ANDROID] measured width: 1920 measured height: 1080
D/AppDemo( 2091): [ANDROID] scale for resources: 2.0 xdpi: 320.0 ydpi: 320.0
D/AppDemo( 2091): [ANDROID] screen density: xhdpi
D/AppDemo( 2091): [ANDROID] screen size: large
D/AppDemo( 2091): [ANDROID] using layout: layout-mdpi
Run Code Online (Sandbox Code Playgroud)

那么,看看指标,为什么没有layout-large-xhdpi被加载?

请告诉我在哪里可以查看.我真的需要找到一种方法来强制Layout/Resource/AssetManager加载特定的布局.

我知道在这个问题上最流行的一句话,就是"你不需要/为什么你有layout-xhdpi,你应该有drawable-xhdpilayout-large"跟我,但熊.

我非常感谢关于在哪里观看以及寻找什么的小提示.到目前为止,AssetManager似乎是开始挖掘/伐木的地方.

当我省略时layout-mdpi,应用程序崩溃了,缺少资源.错误似乎是即使代码返回xhdpi,它也会假设mdpi其他地方.我需要找到这个,并修复它,以便我的应用程序看起来像在ICS上一样好:)

我正在弄清楚哪个布局以简单的方式加载 - 所有根布局都有一个android:tag元素,当setContentView(R.layout.main_layout)我抓取根元素上的标签并知道加载了哪个文件夹.除了视觉反馈,这最终将与我的设备配置相匹配.

提前致谢.

Rob*_*ham 3

有趣的问题。我看了一下,但一切都有点像兔子洞里的情况。没有这样的答案,但也许我的分析会给你指明正确的方向。

我从前方观察发生了什么setContentView。显然,此时您正在谈论与密度无关的布局参考(例如R.layout.main_layout),然后它将变成对 APK 中特定文件的参考。你的问题何时何地提出。

我使用了横向/纵向限定符,以便可以在运行时更改质量,并且我使用了附带 Android 源代码的调试器。

这是一个流程,从某种角度开始。

  1. 资源.getLayout(int)
  2. Resources.loadXmlResourceParser(int, String)
  3. Resources.getValue(int, TypedValue, 布尔值)
  4. AssetManager.getResourceValue(int, int, TypedValue, boolean)
  5. StringBlock.get(int)
  6. StringBlock.nativeGetString(int,int)

让我们倒退一下。

步骤 6 是返回限定引用的本机 (C) 方法,例如/res/layout-land/yourview.xml。然而,它的参数是一个索引,并且该索引根据我们处于横向还是纵向而变化。

要查看它的来源,我们必须返回到步骤 4。索引是 TypedValue 中的一个字段,但在将其传递到此方法时最初并未正确设置。

步骤 4 调用另一个本机方法 ,AssetManager.loadResourceValue()该方法会更改传入的 TypedValue 并相应地设置索引。

也许你可以开始看看 C 的情况,看看进展如何。