×

Android虚拟按键的适配问题

96
hackware
2016.08.07 15:36* 字数 671

新开了 <<Android Tips>> 文集,这个文集主要分享一些短小、简单实用的小技巧。希望大家喜欢。


最近几天逛博客时,赶巧遇到了好几个人在谈Android的虚拟按键适配,问题大概是这样的:

有不少手机,比如华为的大部分手机,Nexus 等都是不带实体按键的,取而代之的是虚拟按键,学名叫 NavigationBar。NavigationBar 显示时会占用一定的屏幕高度,使得 Activity 实际的布局高度变窄了,如果 Activity 中的视图太高,则视图的底部会被 NavigationBar 切掉(遮挡)。

我有点好奇,为什么大家普遍在这个问题上纠结。其实,我并不把它看成是一个技术问题。而应该是一个对设计稿的理解问题。

设计师在设计视觉稿的时候,一般会考虑预留出状态栏区域,将除状态栏以外的区域作为设计区域。但她们基本不会考虑 NavigationBar。视觉稿中底部的一些 UI 元素,往往是通过一些 marginTop 来让它们看起来在底部

试想一下,如果我们在实现的时候,如果完全按照视觉稿中的 marginTop 去做竖向布局,则在带有 NavigationBar 的手机上,实际可用的布局高度小于视觉稿中的设计高度时,超出部分的内容就会被切掉,也就出现了所谓的适配问题。贴一个一般公式:

设计高度 = 屏幕高度 - 状态栏高度
布局高度 = 屏幕高度 - 状态栏高度 - 虚拟按键高度

要解决这个问题,其实很简单,我说过,这不是一个技术问题,因此不必使用 fitsSystemWindows 属性,也避免了副作用。只需要在布局时,正确理解设计师的意图,比如,如果一个按钮在最底部,你应该用 layout_gravity="bottom" 而不是用 marginTop 或者其他方式来把它撑到底部。

一个中心思想是:尽可能的从下往上,而非从上往下布局。不要盲目的完全按照视觉稿中的尺寸去布局,应该区分出不同视觉元素的重要性,优先保证最上方和最下方的元素正确显示,至于中间的元素,多多用相对布局或是weight属性吧。

好了,周末愉快。

Android Tips
Web note ad 1