【问题标题】:How to get Android to pick different layouts based on screen size如何让 Android 根据屏幕尺寸选择不同的布局
【发布时间】:2016-03-09 11:53:07
【问题描述】:

我正在努力让我的布局被 Android 定制和采用。
我使用以下资源目录创建了一个测试应用程序:

  • 布局
  • 布局大
  • 布局正常
  • 小布局
  • layout-sw600dp
  • 布局-sw720dp
  • 布局-w600dp
  • 布局-w720dp
  • layout-xlarge

它们基本上都包含相同的布局文件,唯一的区别是一个文本视图只是具有布局目录名称的内容:

   <android.support.v7.widget.AppCompatTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btnTest"
        android:text="Layout xxxxx" />

我的问题是,无论我创建什么 AVD,它们都会拾取 Normal 布局文件。 这是我测试过的 AVD,以及此调试代码的输出:

 Configuration config = getResources().getConfiguration();
 String sizeName = getSizeName(this);

 Log.d(TAG, String.format("screen config smallestScreenWidthDp:%d screenWidthDp:%d densityDpi:%d sizeName: %s" ,
                config.smallestScreenWidthDp, config.screenWidthDp, config.densityDpi,  sizeName)); //NON-NLS
  • Nexus 6P,1440x2560,518ppi:
    • 最小屏幕宽度Dp:360 screenWidthDp:360 densityDpi:640 sizeName: normal
  • 银河 S4 迷你, 4.3" 540x960, 256ppi:
    • smallestScreenWidthDp:360 screenWidthDp:360 densityDpi:240 sizeName: normal
  • 维科果阿,3.5" 320x480、165 ppi:
    • 最小屏幕宽度Dp:320 screenWidthDp:320 densityDpi:160 sizeName: normal

我做错了什么?

编辑:这不是 AVD 问题,我在物理设备上得到相同的行为;我的应用在 Nexus 6P(1440x2560, 518ppi) 和 Wiko GOA(320x480, 165ppi) 设备上都选择了 Normal 布局。

这是我的test project 供参考。

【问题讨论】:

  • 请试试这个 DisplayMetrics metrics = getResources().getDisplayMetrics();
  • 将您的大文件夹、普通文件夹和小文件夹命名为 sw 符号。不要将两种命名约定混在一起
  • @M.S.P ,那我该怎么办? DisplayMetrics.densityDpi 返回的值与我的其他日志输出相同。
  • @VivekMishra,删除 sw 和 w 文件夹,只保留 -small、-normal、-large 和 -xlarge 不变,什么也没做。
  • 小布局现在不起作用

标签: android screen-size


【解决方案1】:

无论您是使用小型、普通或大型用户还是使用 dp 布局文件夹,Android 设备都会根据其屏幕尺寸自动获取正确的布局。

希望这会奏效!!

【讨论】:

  • 删除 sw 和 w 文件夹,只保留 -small、-normal、-large 和 -xlarge 不变,什么也没做
  • 请您做与此相反的操作,保留 sw 和 w 布局文件夹并删除其他文件夹。
  • 我还分别为屏幕尺寸 5、7 和 10 英寸设计了一个应用程序,为此我只使用简单的 sw600dp 和 sw720dp
【解决方案2】:

根据定义

正常:与中等密度 HVGA 大小相似的屏幕 屏幕。普通屏幕的最小布局尺寸约为 320x470 dp 单位。此类屏幕的示例为 WQVGA 低密度、HVGA 中密度,WVGA 高密度。

但是,由于您的尺寸以 px 表示,我们应该使用以下公式将它们转换为 dp:

dp = 160 * (px/dpi)

现在让我们考虑第一个:

  • Nexus 6P,1440x2560,密度Dpi:640

在这种情况下:

dp(x) = 160 * (1440/640) = 360 
dp(y) = 160 * (2560/640) = 640

所以,这个设备可以被认为是“正常的”。

考虑第二个:

  • Galaxy S4 mini,4.3" 540x960,密度Dpi:240

在这种情况下:

dp(x) = 160 * (540/240) = 360 
dp(y) = 160 * (960/240) = 640

所以,这个设备也可以被认为是“正常的”。 (和拳头一模一样)

这意味着对于您正在测试的每台设备,设备的实际尺寸基本相同。

所以,如果你想要更大的设备,也许你应该降低密度Dpi

例如,如果我有一个像 S4 mini (540x960) 但密度 Dpi:160 的设备将获得:

dp(x) = 160 * (540/160) = 540
dp(y) = 160 * (960/160) = 960

这应该对应于大型或超大型设备

【讨论】:

  • 如何将其转换为布局文件夹,即如何为这 3 个示例使用不同的布局文件?
  • 如前所述,我认为这些设备的尺寸相同。所以,我认为你需要配置一个合适的虚拟设备。降低这三种设备之一的分辨率会增加实际尺寸
  • 嗯,这也发生在物理设备上。我的应用选择在 Nexus 6P (1440x2560, 518ppi) 和 Wiko GOA(320x480, 165ppi) 上使用正常布局,因此这不是 AVD 问题。
猜你喜欢
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多