我的目标是在单个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 .
我们该如何实现呢?在这篇文章中,它表示您设计不同的布局与不同的屏幕相同的名称,并保留对应的文件夹.但是,如果在手机中运行应用程序时尝试初始化平板电脑布局的小部件组件,我的疑问将会出现异常.
编辑2:
这个想法进入我的脑海里是确定我正在使用哪种类型的设备,即Tab或手机.
Determine if the device is a smartphone or tablet?
然后如果应用程序是手机,则避免小部件的初始化.有没有比这更好的方法?
编辑3:
我的应用程序支持从2.3到更高版本
如果我的平板电脑配置与手机布局相比有其他小部件.我如何初始化和使用.希望都明白我的需要.所以请澄清我的疑问
解决方法
res/layout res/layout-sw600dp
那么要区分价值等资源,
res/values res/values-sw600dp res/values-sw720dp
您注意到只有一个布局目录和两个值目录来指定边距和边距等资源.所以单个布局可以用于7“以及10”平板电脑.这是我的场景,你也可以定义layout-sw720dp.我这样做是因为减少了布局的编译时间.
我在手机和平板电脑上也有不同的布局.例如,我在第一个屏幕中有一个ListView,然后当用户单击项目时,它将打开其他活动,并且有DetailView.但在平板电脑中,我已经左侧的ListView和右侧的DetailView.
所以要这样做,在值/字符串中,我放置以下代码,
<bool name="isTablet">false</bool>
对于平板电脑的价值,sw600dp /字符串也是一样
<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);