如何让Android根据屏幕大小选择不同的布局

时间:2016-03-09 11:53:07

标签: android screen-size

我正在努力让我的布局能够被Android定制和拾取 我用这些资源目录创建了一个测试应用程序:

  • 布局
  • 布局大
  • 布局正常
  • 布局小
  • 布局sw600dp
  • 布局sw720dp
  • 布局w600dp
  • 布局w720dp
  • 布局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:
    • smallestScreenWidthDp:360 screenWidthDp:360 densityDpi:640 sizeName:normal
  • Galaxy S4 mini, 4.3“540x960,256ppi:
    • smallestScreenWidthDp:360 screenWidthDp:360 densityDpi:240 sizeName:normal
  • Wiko Goa,3.5“ 320x480,165 ppi:
    • smallestScreenWidthDp:320 screenWidthDp:320 densityDpi:160 sizeName:normal

我做错了什么?

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

这是我的test project以供参考。

2 个答案:

答案 0 :(得分:0)

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

希望这会有效!!

答案 1 :(得分:0)

按照定义

  

正常:与中等密度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

因此,可以将此设备视为&#34;正常&#34;。

考虑第二个:

  • Galaxy S4 mini,4.3&#34; 540x960,密度为Dpi:240

在这种情况下:

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

因此,这个设备也可以被认为是#34;正常&#34;。 (它与第一个完全一样)

这意味着对于您正在测试的每个设备,设备的实际大小基本相同。

所以,如果你想要一个更大的设备,也许你应该减少densityDpi

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

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

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