怎麼知道這是不是一台平板?
利用螢幕密度資料夾,簡易的做判斷
當然是指 Android App 要怎麼判斷目前的環境是不是一台平板電腦。但話又說回來,說到 Android 平版,空氣中似乎有點參雜悲傷。最近專案需要為平板做雙欄(dual pane)介面,也需要對平板做一些特別的調整。
因為以上原因,做了一些調查。很遺憾,目前沒有確切的方法知道 App 的環境是不是一台平板,除非未來廠商有提供 API 查詢,否則現在只能透過螢幕或解析度的大小來推測。
在 Google I/O 2013 年的 Android 程式之中,Google 曾經用以下的方法來判斷是不是平板:
時過境遷,現在 (2018) 的 Android 旗艦手機已經往 6 吋邁進,連憋了很久的友商都出了 6 吋手機在大螢幕上見。為什麼一直提 6 這個夢幻的數字呢?原因是這上面的作法 6 吋以上就會被視為平板。
現在牽扯到「平板是什麼」這個哲學問題,為了避免無限的詢問,先把話題拉回來。我這裡先把 Google Nexus 7 當成判斷平板的基準,將 7 吋以上的機器視為平板 (什麼恐怖的就不要再提了)。
Android 習慣使用的長度單位不是 px (pixel),而是由像素密度換算過的 dp (density-independent pixels)。在 160dpi (aka. mdpi) 的手機上,1dp 會等於 1px。(你可以透過 Display Info 這個 App 知道自己的手機的像素密度 dpi),接下來依照個像素密度進行縮放調整。
0.75 倍 -> ldpi
1 倍 -> mdpi
1.5 倍 -> hdpi
2 倍 -> xhdpi
3 倍 -> xxhdpi
...
我們要用最小寬度 (smallest width) 來推測,目前是不是跑在平板電腦上。他是用 Portrait Mode 下 (直立裝置,這是預設條件),Activity Window 的寬度有沒有超過最小寬度 (smallest width) 來判別。
所以在做平板 Layout 時,Android 的文件才會請開發者新增目錄專門放這類大螢幕的 Layout。
res/layout/main_activity.xml # For handsets
res/layout-sw600dp/main_activity.xml # For 7” tablets
反過來說,也可以利用這個系統特性來判斷是否為平板電腦。我的做法是用 values-sw600dp
資料夾存放布林值,只要查詢這個布林值就能知道現在是否跑在最小寬度超過 600dp 的環境上。
實作
請在原來的 values
資料夾裡頭建立 attrs.xml
檔案,在檔案中加入:
<resources>
<bool name="isTabletSize">false</bool>
</resources>
接下來新增 values-sw600dp
資料夾,也建立 attrs.xml
檔案,只是這次檔案中的 isTabletSize
為 true。
<resources>
<bool name="isTabletSize">true</bool>
</resources>
如此一來,只要在程式裡面查詢這個布林值即可。
這樣簡單設定後,就可以偵測出 7 吋以下的環境了!
雖然現在官方推薦直接用 ConstraintLayout 來解決各種螢幕大小,卻容易造成手機 Layout Fit 所有狀況,變成各種巨大手機畫面。
雙欄 (dual pane) 介面可以更為妥善的利用更大的顯示畫面,可惜最近連 Google 自家的 App 都漸漸的淘汰這種介面了。 (對比 Android 4.4 和 5.0 的設定頁面)