安卓通用应用方法

10

我想开发一款通用应用程序。我对这种方法很新手。这意味着一个单独的apk适用于平板电脑和手机应用程序。我已经阅读了

Support Library

Fragments

我的目标是在单个APk中为平板电脑和手机构建不同的UI界面。

我已阅读《让你的应用程序为Jelly Bean和Nexus 7准备好》。这篇文章提到了

res/layout/activity_home.xml

To take advantage of the extra space on the 7 screen you might provide an alternative layout:

res/layout-sw600dp/activity_home.xml

The sw600dp qualifier declares that these resources are for devices that have a screen with at least 600dp available on its smallest side. 

    Furthermore you might even provide a different layout for 10 tablets:

res/layout-sw720dp/activity_home.xml

这意味着我们可以针对不同的设备使用不同的布局。这让我感到困惑。

编辑1:场景

设想

if my phone UI layout contains one-view pager and 

tablet UI layout contain two-view pager  . 

我们怎样才能实现这一点呢?在这篇文章中,它说你可以为不同的屏幕设计具有相同名称但位于不同文件夹中的不同布局。但是,如果我在手机上运行应用程序时尝试初始化平板电脑布局的小部件,这是否会引起异常?

编辑2: 我想到的主意是确定我正在使用的设备类型,即Tab还是phone。

确定设备是智能手机还是平板电脑?

然后,如果应用程序是电话,则避免小部件的初始化。有没有比这更好的方法?

编辑3: 我的应用程序支持从2.3到更高版本。

如果我的平板电脑布局比电话布局多保留了一些小部件。我该如何初始化和使用它们。希望大家都明白我的需求。那么请解答我的疑问。


这意味着我们可以为不同的设备使用不同的布局。这让我感到困惑。你被什么困扰了?我认为你已经做了很多研究了。 - Fahad Ishaque
我更喜欢使用layout/large(适用于5.1-7英寸设备),layout/xlarge(适用于10英寸平板电脑)和layout normal(适用于移动设备)。移动布局可以通过使用layout/large-xhdpi或ldpi/mdpi/hdpi进一步定义。 - Fahad Ishaque
2个回答

6
当我面对问题时,我创建了以下结构。
res/layout
res/layout-sw600dp

然后区分值和其他资源,
res/values
res/values-sw600dp
res/values-sw720dp

你可能已经注意到只有一个布局目录和两个值目录来指定边距、填充和其他资源。因此,单个布局可以用于7英寸和10英寸的平板电脑。这是我的情况,你也可以定义layout-sw720dp。我这样做是为了减少编译布局的时间。
我在手机和平板上还有不同的布局。例如,在第一个屏幕中,我有一个ListView,然后当用户点击项目时,它将打开另一个活动,并显示DetailView。但在平板电脑上,我有左侧的ListView和右侧的DetailView。
为了实现这一点,在values/strings中,我放置了以下代码:
<bool name="isTablet">false</bool>

同理适用于平板电脑 values-sw600dp/strings

<bool name="isTablet">true</bool>

现在,让我们进入编码部分。我有一个闪屏,具有常见的布局。因此,它将显示常见界面。但是当用户点击任何按钮时,它会检查是否为平板电脑。要进行检查,

boolean isTablet = getResources().getBoolean(R.bool.isTablet);

现在您有一个标志,可以指示您的应用程序是在手机还是平板电脑上运行。

我创建了两个软件包,

com.phone
com.tablet

根据标志,我将我的活动指向手机套餐和平板电脑套餐。

例如,

if(isTablet)
    startActivity(this,TabXYZ.class);
else
    startActivity(this,PhXYZ.class);

这种方法解决了我的问题。


那么你是告诉我为了一个功能要使用两个布局处理类? - edwin
但是,如果屏幕不同,功能将有所不同,我的朋友。如果功能相同,请使用片段(fragment),它可以解决您的问题,但是虽然我在手机和平板电脑的屏幕设计上有问题,我仍然使用这种方法。 - Chintan Rathod
1
我考虑了你的答案,但仍在寻找是否有其他处理方式。 - edwin
参考一些文章显示,sw600dp限定符仅适用于Android 3.2以上的平台。我的应用程序支持从2.3版本开始。你的情况是怎样的? - edwin
@ Edwin,如果你的问题已经得到解决,请标记为已接受答案,这样其他人也可以从中受益。 - Chintan Rathod
显示剩余2条评论

1

findViewById会返回布局中存在的小部件,如果没有这样的小部件,则返回null。因此,如果它返回非空值,则可以继续进行进一步的初始化。


我曾经看到他们有时会这样做:如果您知道在某个布局上比另一个布局有更多的小部件,那么您只需检查该“额外”组中单个小部件的存在即可。 如果findViewById返回非空,则意味着您还将拥有所有其他额外的小部件。 - Alexander Kulyakhtin

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