Android 应用如何判断是否是平板

Post by zerob13

从 Kindle Fire 到 Nexus 4 ,然后一坨坨的诡异山寨平板,现在 Android 平板也算是有一定的市场了。做 App 的时候自然会考虑去兼容一下平板版本, 兼容的方法不外乎两种,一个是再开发一套UI,然后可以出个HD版本或者直接包含在同一个APK中,另外一种就是等比缩放,让控件自适应。

听起来好像后者很厉害的样子,其实后者大部分情况都是很难看的,拉大也好,压缩也好,总是怪怪的。我个人是比较建议一个 APK 两套 UI 自动切换的模式,因为 Android 应用的包也不大,多一套 UI 也就是几百k到1M左右的事情,用户一般也都是 WIFI 下面更新应用,那么何乐而不为呢?

既然如此,那么我们就会涉及到一个问题,就是在应用中判断当前是平板还是手机,考虑到主流平板现在都是 3.2+ 的系统,这里主要讨论的是识别  3.2 以后的机器,当然出于兼容性考虑,后面我也会给出 2.x 的平板识别的方法。

最早的时候,我解决这个问题第一个想法是通过分辨率或者再考虑像素密度来解决。如果单纯考虑分辨率,大概就是这样的处理方式:

public static boolean isTablet(Activity aActivity) { DisplayMetrics metrics = new DisplayMetrics(); aActivity.getWindowManager().getDefaultDisplay().getMetrics(metrics); int width = metrics.widthPixels; int height = metrics.heightPixels; if (width > 1023 || height > 1023) { return true; } else { return false; } }

It works.只能那么说,这个方法我用了很久,基本上也没出啥问题,但是总感觉不够美观,不够 Android 的风格,到是像头痛医头,脚痛医脚的感觉,所以闲下来的时候就跑去翻看 http://developer.android.com 的一些说法。

很幸运的被我找到了,在猛击这里查看 这个页面有如下的一段描述:

One of the difficulties developers had in pre-3.2 Android devices was the “large” screen size bin, which encompasses the Dell Streak, the original Galaxy Tab, and 7″ tablets in general. However, many applications may want to show different layouts for different devices in this category (such as for 5″ and 7″ devices), even though they are all considered to be “large” screens. That’s why Android introduced the “Smallest-width” qualifier (amongst others) in Android 3.2.

于是认真的看了整个说明,发现其实 对于Android 3.2以后的机器是有比较好的区分方法的,就是通过在资源文件夹后面加 -sw600dp 来区分。比如说你想要在平板展示的layout就放到 layout-sw600dp 目录下,String, styles以及color等等都可以如此。如果是 3.2 以前的机器,可用 -xlarge 来区分。这样就可以将资源文件自动匹配映射,就和做多国语言的 Strings 一样,只要不同文件夹下的同名文件,就会匹配到相应的res中。

那么,这个解决了资源文件的区分,同样的,代码中如何区分的,比如说我平板上的 Button 叫 tButton,手机上的是 pButton,这个总不能通过新建文件夹来指定资源了吧。莫非还是要用上述的那个更具根据分辨率的方法?(其实这些资源文件夹区分方式也是系统去根据分辨率区分)显然不是,我们可以用一个更好的方法。分别建立如下文件:

res/values-sw600dp/bools.xml

true

res/values/bools.xml

false

res/values-xlarge/bools.xml

true

然后之前的 isTablet 的判断函数,就可以改成如下所示:

public static boolean isTablet(Context context) { return context.getResources().getBoolean(R.bool.isTablet); }

是不是美好简洁高端大气上档次了许多?O(∩_∩)O~