前言
今来帮助别人解决了一个小需求,刚好涉及到软键盘的弹出和收起操作,所以记录总结一下。
正文
在此首先给出官方的文档地址:传送门,当然需要特殊的打开方式。
以下是本人为方便自己将来使用的抄录。
在AndroidManifest.xml中的activity中设置这个属性可以改变两件事:
· 当Activity成为用户注意的焦点时软键盘的状态——是可见的还是不可见的
· 对Activity 主窗口所做的调整——是否将其尺寸调小来为软键盘腾出空间,或者当窗口部分被软键盘遮挡时是否平移其内容,使得获得当前焦点的控件可见。
该属性的设置必须是下表所列的值中的一个,或者是一个”state···”值加上一个”adjust···“值得组合。在任一组中设置多个值都会产生未定义的结果。值和值之间使用需要使用”|“进行分隔。例如:
<activity android:windowSoftInputMode="stateVisible|adjustResize" . . . >
各个值及其说明如下表
值 | 说明 |
---|---|
stateUnspecified | 不指定软键盘的状态(隐藏还是可见)。将由系统选择合适的状态,或依赖主题中的设置。这是软键盘的默认设置 |
stateUnchaged | 当Activity转至前台时保留软键盘最后所处的任何状态,无论是可见还是隐藏 |
stateHidden | 当用户选择Activity时(即用户确实是向前导航前往到Activity时),而不是因离开另一个Activity而返回到这个Activity时,隐藏软键盘。 |
stateAlwaysHidden | 当Activity的主窗口有输入焦点时始终隐藏软键盘 |
stateVisible | 在正常的适宜情况下(当用户向前导航到Activity的主窗口时)显示软键盘 |
stateAlwaysVisible | 当用户选择Activity时(即当用户确实是向前导航前往到Activity时),而不是因离开另一个Activity而返回时,显示软键盘。 |
adjustUnspecified | 不指定Activity的主窗口是否需要调整尺寸来为软键盘腾出空间,或者窗口内容是否进行平移以在屏幕上显露当前焦点。系统会根据窗口的内容是否存在任何可滚动其内容的布局视图来自动选择其中一种模式。如果存在这样的视图,窗口将进行尺寸调整,前提是可以通过滚动在较小区域内看到窗口的所有内容。这是对主窗口行为的默认设置。 |
adjustResize | 始终调整Activity主窗口的尺寸来为屏幕上的软键盘腾出空间。 |
adjustPan | 不调整Activity主窗口的尺寸来为软键盘腾出空间,而是自动平移窗口的内容,使当前焦点永远不被键盘遮盖,让用户始终都能看到其输入的内容。这通常不如尺寸调整,因为用户可能需要关闭软键盘才能和看到被遮挡的窗口部分或者和他们进行交互。 |
个人理解
经过测试有些不太明白的地方个人的理解是这样的:
1. adjustUnspecified的效果是这样的,分为两种效果,第一种效果是如果界面中没有一个可以滑动的布局的话,那么当控件获得焦点而这个控件可能会被软键盘遮挡的时候,就会将当前的这个界面整个向上平移,如图
第二种效果是如果界面中有一个布满全局的可以滑动的布局的时候,那么当控件获得焦点而这个控件可能会被软键盘遮挡的时候就会将这个滑动的布局的大小压缩,同时将获取焦点的控件移到软键盘的上方,如图
但是需要注意的是,如果这个滑动的布局没有布满全局(如写明了400dp的高度),那么如果软键盘弹出时会遮挡这个滑动布局的时候将不会再次调整布局的尺寸,依然会遮挡。
adjustResize时如果视图中没有布满一个滑动的布局的时候,当控件获取焦点时软键盘会遮挡当前视窗的一部分,不管获取焦点的控件在什么位置;而当视图中有一个布满全局的滑动控件的时候,则将滑动控件中获取焦点的控件放置到弹出的软键盘的上方位置。
adjustPan是会将整个当前的视图进行向上平移,从而显示当前获取到焦点的控件,但是获取到焦点的控件的下面的控件都会被软键盘遮挡,不管界面中是否存在滑动的布局,都会发生这样的变化,而且如果界面中存在滑动布局的时候还会再获取焦点的时候将滑动的控件变得无法滑动。
stateVisible 和 stateAlwaysVisible 的区别:设置了前者的界面被从别的界面跳过来的时候会弹出软键盘,但是当从别的界面退回到这个界面的时候键盘是会隐藏的,而设置了后者的界面在跳转过来还是从别的界面返回到这个设置了的界面的时候都会弹出软键盘。
以上就是我个人对软键盘的弹出和隐藏的设置的资料收集和整理,如有补充会来添加。如有问题,请提出,本人一定修改。