1

我有一个要求,我必须为layout我的应用程序提供不同的资源。

这个应用程序应该在许多屏幕尺寸上运行(一如既往),我希望能够尽可能精确地解决其中的许多问题。

截至目前,我的目标是以下屏幕尺寸:

  • 1280x800
  • 800x480
  • 800x600
  • 1024x600

为此,我创建了一个这样的布局结构:

布局结构

在 XML 中,我声明了以下支持:

<supports-screens android:resizeable="true"
              android:smallScreens="true"
              android:normalScreens="true"
              android:largeScreens="true"
              android:xlargeScreens="true"
              android:anyDensity="true"/>

我正在模拟器中进行测试,问题是:它接受layout-w480dp-landxml,但是当我进入纵向模式时,它会退回到默认布局。

知道我哪里可能出错了吗?

4

5 回答 5

3

正如我在Android聊天室中所说,Pixels并且Density-independent pixel (dp)有所不同:

与密度无关的像素 (dp)

定义 UI 布局时应使用的虚拟像素单位,以与密度无关的方式表示布局尺寸或位置。与密度无关的像素相当于 160 dpi 屏幕上的一个物理像素,这是系统为“中等”密度屏幕假定的基线密度。在运行时,系统会根据使用中屏幕的实际密度,根据需要透明地处理 dp 单位的任何缩放。dp 单位到屏幕像素的转换很简单:px = dp * (dpi / 160)。例如,在 240 dpi 的屏幕上,1 dp 等于 1.5 个物理像素。在定义应用程序的 UI 时,您应该始终使用 dp 单位,以确保您的 UI 在不同密度的屏幕上正确显示。

当您有一个名为 layout-w480dp 的文件夹时,您要说的是:

“只要宽度尺寸等于或大于 480 dp ,请使用此布局文件夹。”

现在,如果您的设备具有 240dpi 且屏幕尺寸为 480x800 像素(这很可能),那么您实际上只有320dp可玩 - 解释了为什么您的文件夹现在被跳过了。

dp = 像素 / (dpi / 160)

320dp = 480 像素 / (240dpi / 160)

于 2012-06-25T12:30:11.290 回答
1

我可以向您推荐 Reto Meier 的 Google I/O 2011 会议之一:

在支持旧版本的同时支持最新设备的一种方法是使用“shim”活动来确定设备运行的平台。它没有用户界面。Reto 显示了一些用于根据系统版本启动不同活动的代码。这是一个并行活动模式......

Link to session - 他的演讲也可以下载,平行模式原理从幻灯片10开始

于 2012-06-25T12:30:36.803 回答
0

我听说过以下布局资源:

res/layout-sw600dp
res/layout-sw720dp

不确定您的问题,但我还没有听说过w480dp,可能是sw480dp

于 2012-06-25T11:37:25.390 回答
0

采用

ldpi    Resources for low-density (ldpi) screens (~120dpi).
mdpi    Resources for medium-density (mdpi) screens (~160dpi). (This is the baseline density.)
hdpi    Resources for high-density (hdpi) screens (~240dpi).
xhdpi   Resources for extra high-density (xhdpi) screens (~320dpi).

而不是 w480dp

并遵循下表。 安卓文档

于 2012-06-25T11:44:12.070 回答
0

好吧,我从来没有按照你的方式做,但我所做的是在运行时测量屏幕大小和密度,并在开始时在 onCreate() 中应用布局。这是供您参考的代码,可能会对您有所帮助:

    /**
     * To acknowledge the density of the application so as to use the layout
     * according to the phone density
     */
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    switch(metrics.densityDpi){
         case DisplayMetrics.DENSITY_LOW:
             setContentView(R.layout.x);
                    break;
         case DisplayMetrics.DENSITY_MEDIUM:
             setContentView(R.layout.y);
                     break;
         case DisplayMetrics.DENSITY_HIGH:
             setContentView(R.layout.z);
                     break;
于 2012-06-25T11:51:48.190 回答