新開了 <<Android Tips>> 文集,這個文集主要分享一些短小、簡單實用的小技巧。希望大家喜歡。
最近幾天逛博客時,趕巧遇到了好幾個人在談Android的虛擬按鍵適配,問題大概是這樣的:
有不少手機,比如華為的大部分手機,Nexus 等都是不帶實體按鍵的,取而代之的是虛擬按鍵,學名叫 NavigationBar。NavigationBar 顯示時會占用一定的屏幕高度,使得 Activity 實際的布局高度變窄了,如果 Activity 中的視圖太高,則視圖的底部會被 NavigationBar 切掉(遮擋)。
我有點好奇,為什么大家普遍在這個問題上糾結。其實,我并不把它看成是一個技術問題。而應該是一個對設計稿的理解問題。
設計師在設計視覺稿的時候,一般會考慮預留出狀態欄區域,將除狀態欄以外的區域作為設計區域。但她們基本不會考慮 NavigationBar。視覺稿中底部的一些 UI 元素,往往是通過一些 marginTop 來讓它們看起來在底部。
試想一下,如果我們在實現的時候,如果完全按照視覺稿中的 marginTop 去做豎向布局,則在帶有 NavigationBar 的手機上,實際可用的布局高度小于視覺稿中的設計高度時,超出部分的內容就會被切掉,也就出現了所謂的適配問題。貼一個一般公式:
設計高度 = 屏幕高度 - 狀態欄高度
布局高度 = 屏幕高度 - 狀態欄高度 - 虛擬按鍵高度
要解決這個問題,其實很簡單,我說過,這不是一個技術問題,因此不必使用 fitsSystemWindows 屬性,也避免了副作用。只需要在布局時,正確理解設計師的意圖,比如,如果一個按鈕在最底部,你應該用 layout_gravity="bottom" 而不是用 marginTop 或者其他方式來把它撐到底部。
一個中心思想是:盡可能的從下往上,而非從上往下布局。不要盲目的完全按照視覺稿中的尺寸去布局,應該區分出不同視覺元素的重要性,優先保證最上方和最下方的元素正確顯示,至于中間的元素,多多用相對布局或是weight屬性吧。
好了,周末愉快。
額,貌似這篇文章所講述的內容和大家所期望的不是同一個東西。