【问题标题】:How to make my app look the same in all devices?如何让我的应用在所有设备上看起来都一样?
【发布时间】:2015-02-19 17:37:49
【问题描述】:

我刚开始进行 android 开发,我在 android studio 上构建了一个应用程序,我想让我的应用程序在所有设备上都具有相同的设计:

三星 Galaxy S4 => 1080x1290 ; 5.0”

Galaxy Nexus => 720x1280 ; 4.7”

Nexus 4 => 768x1280 ; 4.7”

摩托罗拉 Droid Razr M => 540x960 ; 4.3”

Nexus S => 480x800 ; 4”

银河 S2 => 480x800 ; 4.3”

银河王牌 => 320x480 ; 3.5”

银河注 => 800x1280 ; 5.3”

Galaxy Note II => 720x1280 ; 5.5”

Nexus 10 => 2560 x 1600 ; 10.1”

Galaxy Tab 10.1 => 1280*800 ; 10.1”

Galaxy Note 8.0 => 1280*800 ; 8.0”

Galaxy Tab 7.7 => 1280*800 ; 7.7”

Nexus 7 => 1280*800 ; 7.0”

银河标签 => 1024*600 ; 7.0”


我在这里阅读了这些和很多问题

http://developer.android.com/training/multiscreen/index.html

http://developer.android.com/guide/practices/screens_support.html#DeclaringTabletLayouts

我在“dp”中使用了宽度/高度,并用所有项目制作了这个

android:layout_margin
android:paddingLeft
android:paddingRight
android:paddingTop
android:paddingBottom

它工作正常,但据我所知,有一种方法可以读取设备屏幕,然后决定在应用程序中打开哪个布局,假设我有一个布局并且我有这些尺寸

res/layout/main_activity.xml # 用于手机(小于 600dp 可用宽度) res/layout-sw600dp/main_activity.xml # 适用于 7 英寸平板电脑(600dp 宽和更大) res/layout-sw720dp/main_activity.xml # 适用于 10” 平板电脑(720dp 宽和更大)


我的问题是:我如何编写我的 java 活动来读取我的应用程序在其上运行的设备屏幕,然后决定打开哪个布局,就像设备是 S2 一样,然后 java 做出这样的事情:

if (tabletDeviceSize) {

//use tablet support layout

} else

{

//another layout for mobile support

}

我看到了这段代码,但我需要完整的,因为我的编码并不完美:(

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
switch(metrics.densityDpi){
  case DisplayMetrics.DENSITY_LOW:
            break;
  case DisplayMetrics.DENSITY_MEDIUM:
             break;
  case DisplayMetrics.DENSITY_HIGH:
             break;
}

【问题讨论】:

    标签: android layout screen-orientation screen-size android-screen-support


    【解决方案1】:

    根据official documentation,您无需以编程方式决定使用哪种布局与相应的屏幕尺寸。

    针对不同的屏幕尺寸和优化应用程序的 UI 密度,您可以为任何 广义尺寸和密度。通常,您应该提供 一些不同屏幕尺寸的替代布局和 不同屏幕密度的替代位图图像。 在运行时, 系统根据您的应用程序使用适当的资源 关于当前设备屏幕的通用尺寸或密度。

    换句话说,如果您遵循文档中所述的建议,我可以看到您已经完成,将布局文件放在各自的资源文件夹中,如下所示:

    res/layout/main_activity.xml # For handsets (smaller than 600dp available width)
    res/layout-sw600dp/main_activity.xml # For 7” tablets (600dp wide and bigger) 
    res/layout-sw720dp/main_activity.xml # For 10” tablets (720dp wide and bigger)
    

    然后系统将决定使用哪种布局。您无需在运行时指定其他代码。

    如果您想根据您的屏幕分辨率进行更改,您可以使用以下代码获取宽度和高度(以像素为单位)

    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    int width = size.x;
    int height = size.y;
    

    然后根据widthheight 变量做一些切割,例如就你的 S2 而言:

    if(width == 480 && height == 800){
        //Do work that's related to the S2 screen resolution
    }else if(...){
    
    }
    

    【讨论】:

    • 如果我假设我的按钮 (bt1) 在三星 s2 上的高度“32 dp”和宽度“72dp”是完美的,那么?我会怎么做?!
    • 然后在layout.xml 文件中定义该布局,该文件位于res/layout-sw480 @amerhalem
    • 你说的如果是对的,那将是(非常有帮助),所以我必须为每台设备设计一个布局,然后应用程序会自动选择你之前说的最好的一个,,,好的,,, S2 的 "res/layout-sw480",所以对于其他设备,您知道制作目录 S3、S4、Dous..etc 的正确名称吗?
    • 您只需要考虑它们的屏幕尺寸和(偶尔)密度,但主要是您的布局文件的屏幕尺寸。我强烈建议您阅读涵盖该主题的official documentation。但由于 S2 的屏幕宽度为 480 像素,它将使用layout-sw480 中的布局,以及任何其他屏幕宽度为 480 像素的设备。因此,为您计划支持的设备定义不同的布局。如果您找到宽度 = 600 的设备,则将该布局添加到 layout-sw600 文件夹中。 @amerhalem
    【解决方案2】:

    如果你问如何获取设备屏幕的密度,我花了 3 秒才找到答案(不包括在我最喜欢的搜索引擎中输入“android get device density”的时间):

    getting the screen density programmatically in android?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 2019-04-06
      • 1970-01-01
      相关资源
      最近更新 更多