android全屏/沉浸式状态栏下,各种键盘挡住输入框解决办法[转]

*本篇文章已授权微信公众号(郭霖)独家发布
在开发中 , 经常会遇到键盘挡住输入框的情况,比如登录界面或注册界面,弹出的软键盘把登录或注册按钮挡住了,用户必须把软键盘收起,才能点击相应按钮,这样的用户体验非常不好 。像微信则直接把登录按钮做在输入框的上面,但有很多情况下,这经常满足不了需求 。同时如果输入框特别多的情况下,点击输入时,当前输入框没被挡?。?但是当前输入框下面的输入框却无法获取焦点,必须先把键盘收起,再去获取下面输入框焦点,这样用户体验也非常不好,那有什么办法呢?
系统的和有什么区别,他们使用时的注意事项,有什么系统要求及蔽端呢?
下面对几种在开发中常用的方法进行总结:
方法一:非透明状态栏下使用和,或是透明状态栏下使用=true属性
主要实现方法:
在.xml对应的里添加
:=””或是:=””属性
这两种属性的区别,官方的解释是:
这两个属性作用都是为了调整界面使键盘不挡住输入框 ,我这里对这两种属性使用场景、优缺点、注意事项进行了全方面总结,不知大家平时使用时是否注意到了 。
属性注意事项优缺点失效情况适用情况
需要界面本身可调整尺寸 , 
如在布局添加,或输入控件属于/某一项
优点:1.不会把标题栏顶出当前布局;
2.有多项输入时,当前输入框下面的输入框可上下滑动输入
缺点:1.需要界面本身可调整尺寸;
2. 全屏时失效
1.主窗口尺寸无法调整;
2.全屏
3..0以上通过style设置沉浸式状态栏模式而不设置为true
非全屏或是非沉浸式状态栏输入界面,输入框比较多
页面不会重新布局,当前输入框和键盘会直接将当前输入框以上界面整体向上平移,这样即使界面包含标题栏,也会被顶上去
优点:使用简单,不需要界面本身可调整尺寸,不会有失效情况
缺点:会把标题栏顶出当前布局;有多项输入时,当前输入框下面的输入框无法输入 , 必须收起键盘显示输入框再输入

有少量输入项,且输入量居界面上方
如果多个View设置了=”true”,只有初始的view起作用,都是从第一个设置了的view开始计算
优点:使用简单,需要沉浸式状态栏的界面,不需要自己计算状态栏的高度
缺点:使用有限制
1.View 的其他值被重新改写了
2.手机系统版本>= 4.4
1.界面全屏
2.设置界面主题为沉浸式状态栏
假设原始界面是一个包含若干,如下图所示 , 在分别使用两种属性时的表现 。
1?
整个界面向上平移,使输入框露出,它不会改变界面的布局;界面整体可用高度还是屏幕高度,这个可以通过下面的截图看出 , 如点击输入框6,输入框会被推到键盘上方 , 但输入框1被顶出去了,如果界面包含标题栏,也会被顶出去 。
2?
需要界面的高度是可变的,或者说主窗口的尺寸是可以调整的 , 如果不能调整,则不会起作用 。
例如:的xml布局中只有一个包含若干,在的.xml中设置:=””属性,点击输入框6, 发现软键盘挡住了输入框6,并没有调整 , 如下图所示:
但使用这两种属性,我们可以总结以下几点:
1) 使用, 如果需要输入的项比较多时 , 点击输入框,当前输入项会被顶到软键盘上方,但若当前输入框下面还有输入项时 , 却需要先收起键盘 , 再点击相应的输入项才能输入 。这样操作太繁琐了 , 对于用户体验不大好;

android全屏/沉浸式状态栏下,各种键盘挡住输入框解决办法[转]

文章插图
2) 的使用,需要界面本身可显示的窗口内容能调整,可结合使用;
方法二:在界面最外层布局包裹 1?只使用
在相应界面的xml布局中,最外层添加一个,不在.xml中设置任何:属性,此时点击输入框,输入框均不会被软键盘档住 。即使当前输入框下方也有输入框,在键盘显示的情况下,也可以通过上下滑动界面来输入,而不用先隐藏键盘,点击下方输入框,再显示键盘输入 。
我们可以根据 的 工具来查看界面真正占用的布局高度,工具在
通过该工具 , 我们看到:
界面真正能用的高度=屏幕高度-状态栏高度-软键盘高度
界面中蓝框是真正界面所用的高度:
2?+
我们再在该类的.xml中设置属性为,

发现当前输入框不会被挡?。?但是输入框比较多时 , 在有键盘显示时,界面上下滑动,但只能滑动部分,且如果输入框在界面靠下方时,点击输入框,标题栏也会被顶出去,如下图所示:
我们借助 工具查看此设置布局可用高度,从下图可以看出,此时布局可用高度是屏幕的高度,上下滑动也只是此屏的高度 , 在输入框9以下的输入框滑不出来,向上滑动 , 也只能滑到输入框1 。
3?+
我们前面说过的使用必须界面布局高度是可变的 , 如最外层套个或是界面可收缩的,才起作用 。这里在该类的.xml中设置属性为,

发现效果和1不设置任何属性类似,其使用高度也是:屏幕高度-状态栏高度-软键盘高度
我们再来看看默认属性值:
可以看出,系统将选择合适的状态,也就是在界面最外层包含一层时,设置默认属性值其实就是属性 。
但以下两方面无法满足需求:
1) 当设置成全屏模式时或是使用沉浸式状态栏时,界面最外层包裹 ,当输入框超过一屏 , 当前输入框下面的输入框并不能上下滑动来输入 , 情况类似于+ , 只能滑动部分,通过 也可以看到 , 界面可用高度是整个屏幕高度,并不会进行调整高度 。即使设置,也不起作用 。
2) 如果是类似于注册界面或是登录界面,键盘会挡住输入框下面的登录按钮 。
沉浸式状态栏/透明状态栏情况下
自系统4.4(API>=19)就开始支持沉浸式状态栏,当使用觉 (系统窗口),显示系统一些属性和操作区域,如 最上方的状态及没有实体按键的最下方的虚拟导航栏 。
:=“true”会使得屏幕上的可布局空间位于状态栏下方与导航栏上方
方法三:使用方法,当键盘弹起时 , 让界面整体上移;键盘收起 , 让界面整体下移
使用场景:针对界面全屏或是沉浸式状态栏,输入框不会被键盘遮挡 。主要用于一些登录界面 , 或是需要把界面整体都顶上去的场景 。
1?主要实现步骤:
(1) 获取布局xml的最外层控件,如xml文件如下:

先获取到最外层控件
RelativeLayout main = (RelativeLayout) findViewById(R.id.main);
(2) 获取到最后一个控件,如上面的xml文件,最后一个控件是
Button login_btn = (Button) findViewById(R.id.login_btn);
(3) 给最外层控件和最后一个控件添加监听事件