Android的哪个部分负责挑选正确的资源configuration文件?

我有一个奇怪的问题。

在您想出一个想法来抨击我之前,我正在研究一个定制果冻豆。 因此,“平常的好方法”在这里可能不起作用,并且必须制定肮脏的解决方法。

我有一个包含以下资源的APK:

layout layout-mdpi layout-land layout-large-mdpi layout-large-land-mdpi layout-large-hdpi layout-large-xhdpi 

还有一些其他的度量代码返回这个:

 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 

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

请告诉我在哪里可以看这个。 我真的需要find一种方法来强制布局/资源/ AssetManager加载一个特定的布局。

我知道在这个问题上最stream行的评论是“你不需要/为什么你有layout-xhdpi ,你应该有drawable-xhdpilayout-large ”,但是,忍耐着我。

我甚至非常感激,甚至可以在哪里寻找,寻找什么。 到目前为止, AssetManager似乎是开始挖掘/logging的地方。

当我省略layout-mdpi ,应用程序崩溃,缺less资源。 该错误似乎是即使代码返回xhdpi ,它假定其他地方的mdpi 。 我需要find这个,并修复它,所以我的应用程序看起来像他们在ICS上做得好:)

我计算出哪个布局以一种简单的方式加载 – 所有的根布局都有一个android:tag元素,当我setContentView(R.layout.main_layout)我抓住根元素上的标签,并知道加载了哪个文件夹。 除了视觉反馈之外,这将最终与我的设备configuration相匹配。

提前致谢。

Solutions Collecting From Web of "Android的哪个部分负责挑选正确的资源configuration文件?"

有趣的问题。 我看了一眼,但是这一切都在兔子洞下面。 没有答案,但也许我的分析会让你朝正确的方向发展。

我看着从setContentView转发发生了什么。 很明显,在这一点上,你正在谈论密度不可知的布局参考(例如R.layout.main_layout ),然后它将变成对APK中特定文件的引用。 何时何地您的问题。

我使用了横向/纵向限定符,这样我可以在运行时改变质量,而且我使用了一个附带Android源代码的debugging器。

这是一个stream程,从某种方式入手。

  1. Resources.getLayout(INT)
  2. Resources.loadXmlResourceParser(int,String)
  3. Resources.getValue(int,TypedValue,boolean)
  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,看看你如何继续。

市面上有很多像Micromax Funbook这样的黑屏设备,它们的屏幕尺寸很大,但是使用mdpi资源相信我已经和他们一起工作,这是非常令人沮丧的。

正如你所提到你的应用程序与其他设备的工作很好,它只是没有与这个特定的平板电脑工作,你可能需要实现这样的解决scheme张贴在这里

http://android-developers.blogspot.in/2011/07/new-tools-for-managing-screen-sizes.html

你必须阅读这个页面上的最后一段,它肯定会有所帮助。

在这里总结一下,build议的方法是使用不同的资源完全创build不同名称的单独布局。

您正在驾驶资源拣选过程而不是系统。 这可能是耗时的,但肯定会有所帮助。

 public class MyActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(); Configuration config = getResources().getConfiguration(); if (config.smallestScreenWidthDp >= 600) { setContentView(R.layout.main_activity_tablet); } else { setContentView(R.layout.main_activity); } } } 

我不知道如果我得到你的权利,你正在build立一个自定义的AndroidOS,你想这个自定义的AndroidOS总是加载相同的布局资源,在你的情况layout-large-xhdpi?

如果是这样,我认为你已经定制了configuration类 。 如果你想快速和肮脏,你可以重写72行和下面的int常数。

混凝土,改变:

 .... 100 public static final int SCREENLAYOUT_SIZE_LARGE = 0x03; 108 public static final int SCREENLAYOUT_SIZE_XLARGE = 0x04; 

至:

 .... 100 public static final int SCREENLAYOUT_SIZE_LARGE = 0x04; 108 public static final int SCREENLAYOUT_SIZE_XLARGE = 0x04; 

其他方式可以是重写构造函数和setToDefaults()方法,以便始终加载相同的屏幕布局。

我没有尝试过,我不知道它是否工作,我没有可信和/或官方的消息(排除官方Android代码),但我希望我能帮助你。