如何为不同屏幕开发一个Android应用程序?

3
我希望开发一个适用于Galaxy Tab和Android手机的应用程序。Tab和手机的UI非常不同。例如,在Tab上,我们使用了片段等,而在手机上,我们想要使用选项卡。
我知道可以通过使用layout-smalllayout-large来显示不同的UI,但功能呢?
我该怎么做?有没有一种简单的方法来处理不同屏幕的功能?或者最好创建两个应用程序?

我的意见是分别为3.0以下和3.0以上的版本开发两个应用程序。 - PedroAGSantos
1
我不明白你的意思。 - Harshad
他在暗示任何框架版本为3.0或更高的设备都是平板电脑。这是错误的,如果假设它是正确的,将会导致您的应用在未来的设备上出现问题 :) - Alexander Lucas
@ Alexander Lucas - 但是Galaxy Tab的版本低于3.0,但仍然是一款平板电脑。这就是我的担忧所在。 - Harshad
你想做什么需要根据屏幕的大小/密度使用不同的功能? - CrackerJack9
当设备是手机时,我想显示一个有4个选项卡的UI。但是当设备是平板电脑时,屏幕很大,所以我们想使用片段将其分成两部分。但这需要在两个方面进行编码。如果我在layout-smalllayout-large中有不同的main.xml,设备本身将根据手机屏幕选择要使用哪一个。同样,如果我有两个MyActivity.java来执行任务,我可以像上面那样简单地使用它吗? - Harshad
4个回答

6
请先阅读最近的博客文章,该文章概述了应用程序如何看待不同的屏幕尺寸并对其进行调整:http://android-developers.blogspot.com/2011/07/new-tools-for-managing-screen-sizes.html。这篇文章提供了一些基本调整的例子,即为不同的屏幕尺寸提供不同的布局文件。
如果您已经使用片段编写UI,则可以使用片段来填充不同的选项卡,而无需完全不同的实现。如果您的目标是Android 3.0或更高版本,则很容易实现,因为操作栏已经具有简单的机制,使其选项卡可以在片段之间切换。这个API演示提供了一个非常简单的例子:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/ActionBarTabs.html
如果您想在旧版本的平台上运行,则需要使用v4支持库中的片段API。这些允许您使用片段编写应用程序,并仍能在平台的所有版本上运行,包括Android 1.6(API 4)。在MR2中,我们还添加了一些示例代码,展示如何使用支持库片段与旧的选项卡API。
此功能的示例代码包含在现已弃用的TabActivity类中:http://developer.android.com/reference/android/app/TabActivity.html

3
这个问题没有单一的答案 - 它是一个广泛的话题。
在开始之前要记住的一件事是,目前在网络上有很多代码假设您可以通过平台版本来判断屏幕大小:即,所有高于Gingerbread的都是平板电脑,而Honeycomb(及以上)是平板电脑。这是一个坏主意,不要这样做 :) 也尽量避免使用大型switch case,它只基于从系统中提取的宽度/高度值执行不同的代码块。我不会描述如何做到这一点,其他人已经给出了答案。
要调查的一件事是Android Compatibility Package-它使您可以在早期版本的Android平台中使用Fragment和Loader(这些功能是在Honeycomb中引入的)。这启用了一种常见的模式,即在平板电脑上让您设置导航片段和内容片段并排显示(如果有空间),但当在手机或较小的屏幕上选择项目时,导航片段将切换到内容片段。
如果你只是想让图片随着屏幕大小而变化(而不是以编程方式绘制),那么答案是9-patches
此外,如果适用于您的应用程序,您还可以使用Android Market的Multiple APK support。链接页面深入介绍了如何设置它,并为您提供了一个相当可靠的描述,说明何时使用它以及何时最好使用单个APK。

2
尝试将您的应用程序拆分为不同的部分,一个主干包含您作为库开发的核心功能,然后使用具有特定UI设计的相同核心功能的两个单独的应用程序,一个用于Android平板电脑版本(> 3.0 HoneyComb),另一个用于“手机”版本(<3.0)。
我使用GalaxyTab等设备(基本上是带有“手机”非HoneyComb操作系统的平板电脑)的经验是,电话布局可以很好地拉伸以适应7英寸屏幕。因此,可能只需添加专门为大屏幕制作的layout.xml即可。但是,在我的应用程序中,我甚至没有发现这是必要的...
编辑:还要注意,如果平板电脑运行非Honeycomb OS,例如2.2或2.3,就像GalaxyTab和许多7英寸平板电脑一样,功能与电话完全相同,因此除了UI组件的布局之外,不需要进行特定的重新设计。
编辑:阅读此页面以获取有关如何支持应用程序中的不同屏幕大小的具体详细信息。您可以在清单中指定应用程序支持的屏幕大小。
<manifest ... >
    <supports-screens android:requiresSmallestWidthDp="600" />
    ...
</manifest>

鉴于目前市场支持上传同一应用的多个apk,您可以为每个屏幕大小单独编译不同版本的应用程序,市场将根据清单中的大小过滤它们,因此您甚至永远不必在代码中实际检查屏幕大小。

1
唯一需要补充的是:你正在通过 UI 的差异来限制应用程序。你的活动(以及库)大多数情况下都是由直接用户输入控制和启动的,因此在不同的布局状态下不显示按钮将为你控制应用程序的功能。 - jlindenbaum

2

您可以使用以下代码来获取屏幕大小:

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();
int height = display.getHeight();

您需要确定不同特性所需的屏幕尺寸,例如将最小平板高度和宽度设置为min_tab_heightmin_tab_width。然后检查此屏幕尺寸是否符合要求:

boolean is_tablet = false;
if (width >= min_tab_width && height >= min_tab_height) {
    is_tablet = true;
}

现在您可以在允许平板电脑功能的应用程序之前检查 if (is_tablet)(或非平板电脑功能的 if (!is_tablet))。请保留HTML标签。

display.getWidth()的历史可以追溯到1.0版本,并且已经被弃用,在HoneyComb中,它被getSize(point)所取代,但是对于这里的目的来说仍然不适用,请参考Android参考文档了解更多细节。无论如何,使用这个方法只能获取显示屏的像素大小,而不能得知其物理尺寸。 - Smugrik
能否解释一下为什么要踩我?这是一个有效的答案,它有代码并且解释得很清楚。 - Phil
好的,你说得对,它确实被编辑得很好,所以我撤销了投票。我投反对票是因为我认为这真的不是正确的方法,因为你最终会在代码中添加各种检查来支持你想要支持的所有不同屏幕尺寸,在Android上有很多这样的屏幕。 - Smugrik
@Smugrik,你的回答很好,但有点复杂。这个回应提供了一个简单的方法来完成同样的事情。解决这个问题有几种方法 - 这也是为什么这个网站允许多个答案的原因。 - Phil
但是这种方法无法区分像Archos 7英寸平板电脑(分辨率为480x800)和高分辨率手机(如HTC Sensation或Moto Atrix,分辨率为540x960)之类的设备。 - Smugrik
这个例子是有问题的,而且非常严重,因为它没有适应屏幕密度。没人应该直接使用这段代码,因为这会导致你的应用在所有高密度设备上出现问题。幸运的是,解决方案很简单:通过密度比例除以数值,这样你就可以使用dp单位进行测量了。 - hackbod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接