最近在做一个银行的项目,所以需要自定义键盘,不再使用系统的键盘了,从中也遇到了很多问题,比如怎么控制系统键盘不弹出,然后怎么控制软键盘与当前Activity的交互,是时候了解下WindowSoftInputMode了,这个属性就是来设置窗口软键盘的交互模式的。
它总共有9种状态,官方给的9种状态的解释大概如下:
【1】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
【2】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
【3】stateHidden:用户选择activity时,软键盘总是被隐藏
【4】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
【5】stateVisible:软键盘通常是可见的
【6】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
【7】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
【8】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
【9】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
下面我们结合Demo一个一个来讲这几个属性。
1、stateUnspecified中文意思是未指定状态,当我们没有设置android:windowSoftInputMode属性的时候,软件默认采用的就是这种交互方式,系统会根据界面采取相应的软键盘的显示模式,比如,当界面上只有文本和按钮的时候,软键盘就不会自动弹出,因为没有输入的必要。那么,当界面上出现了获取了焦点的输入框的时候,软键盘会不会自动的弹出呢?这个还真不一定!比如,在下面的这个界面布局中,软键盘并不会自动弹出。
我们还是借用上一篇博客的例子,运行下可见当我们把android:windowSoftInputMode设置为stateUnspecified的时候:
**可见,启动Activity的时候键盘并没有自动弹起来,
当我们嵌套一个ScrollView在最外面的时候,再次启动Acitivty,我们看一下效果:**
键盘成功弹起,我们发现当有自动获取焦点的EditText嵌套在可滑动的View中的时候,键盘默认是弹出的。所以隐藏键盘另外一种方式可以让EditText失去焦点,我们把EditText的focus设置false试一下:
我们发现,键盘不再弹起来了,尽管是嵌套了一个ScrollView,我们接着把第一个EditText设置为android:focusable=”false”,我们发现焦点聚焦在了第二个,键盘照样弹起了,这也验证了我们的猜测。
总结:当设置属性为stateUnspecified的时候,系统是默认不弹出软键盘的,但是当有获得焦点的输入框的界面有滚动的需求的时候,会自动弹出软键盘。至于为什么非要强调要获取焦点的输入框,这是因为,如果不是输入框获取焦点,软键盘也是不会自动弹出的,让界面不自动弹出软键盘的其中一个解决方案,就是在xml文件中,设置一个非输入框控件获取焦点,从而阻止键盘弹出。
2、stateUnchanged 中文的意思就是状态不改变的意思,我们应该怎么理解这句话呢?其实很好理解,就是说,当前界面的软键盘状态,取决于上一个界面的软键盘状态。举个例子,假如当前界面键盘是隐藏的,那么跳转之后的界面,软键盘也是隐藏的;如果当前界面是显示的,那么跳转之后的界面,软键盘也是显示状态。
我们换一个demo测试一下啦,
我们A中是有EditText跟一个Button嵌套了一个ScrollView,默认也就是弹起键盘的,B页面上面都没有,就一个EditText,我们从A跳转到B,默认A界面是会弹起键盘的,我们看看B界面有没有弹起界面(B界面设置为android:windowSoftInputMode=”stateUnchanged”):
**可以得出结论了:
当前界面的软键盘状态,取决于上一个界面的软键盘状态。**
**3.stateHidden
顾名思义,如果我们设置了这个属性,那么键盘状态一定是隐藏的,不管上个界面什么状态,也不管当前界面有没有输入的需求,反正就是不显示。因此,我们可以设置这个属性,