我想开发一款通用应用。我是这种方法的新手。这意味着平板电脑和手机应用程序的单个apk。我经历了
我的目标是在单个APk中为平板电脑和手机构建不同的用户界面。
我读过Getting Your App Ready for Jelly Bean and 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 .
我们怎样才能做到这一点?在这篇文章中,它说你为不同的屏幕设置了相同名称的不同布局,并保留相应的文件夹。但是,如果它在手机中运行应用程序时尝试初始化Tablet布局的窗口小部件组件,我会怀疑会出现例外情况。
编辑2: 我想到的想法是确定我正在使用哪种类型的设备,即Tab或手机。
Determine if the device is a smartphone or tablet?
如果app是手机,则避免小部件的初始化。还有比这更好的方法吗?
编辑3: 我的应用程序支持从2.3到更高版本
如果平板电脑的布局与手机布局相比还有额外的小部件。如何进行初始化和使用。希望大家都明白我的需要。所以请澄清我的疑问
答案 0 :(得分: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>
和平板电脑相同值-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);
这种方法解决了我的问题。
答案 1 :(得分:1)
findViewById
将返回小部件,以防它出现在布局中null
以防万一没有这样的小部件。因此,如果它返回非null,则可以继续进行进一步的初始化。