android 软键盘使用总结

最近又遇到一个软键盘的问题,设置了后,无法关闭。解决后,干脆总结一下android 软件盘的使用。

基本使用方法

如果想要Activity一启动就设置android软件盘的状态。可以在Activity的配置就就设置,如下。

//AndroidManifest.xml
<Activity
    android:name="com.test.MainActivity"
    android:windowSoftInput=["stateUnspecified","stateUnChanged","stateHidden","stateAlwaysHidden","stateVisible","stateAlwaysVisible",
        adjustUnspecified","adjustResize","adjustPan"]
    ...

这其中大概分成两个部分state 和adjust。根据字面意思就可以大概知道其意思。一个是键盘的状态,一个是键盘与屏幕的适应关系
stateUnspecified:系统的状态不指定。由系统的主题等东西,来确定。
stateUnChanged:这个字面已经告诉我们意思了,UnChanged。这个软键盘将会根据之前的情况来设置,保持与之前的软件盘一致。
statehidden: 这个是当用户选择了这个Activity的时候,软键盘隐藏。就是说当用户浏览Activity的时候,进入这个Activity。而不是当用户从另外一个Activity返回的时候。
想想看,这个意思就是说你新进入一个Activity的时候,软键盘隐藏。但是如果你是从另外一个Activity返回而进入该Activity,那就不一定了。(比如一个Activity finish后,会到现在的activity)
stateAlwaysHidden:这个就是说,反正就是进入就会隐藏,即使是从其他的Activity返回。
stateVisible:与上面stateHidden类似。
stateAlwaysVisible:与上面的stateAlwaysHidden类似。
adjustUnSpecified:这是默认的设置,其实就是看情况来定。

It is unspecified whether the activity’s main window resizes to make room for the soft keyboard, or whether the contents of the window pan to make the current focus visible on-screen. The system will automatically select one of these modes depending on whether the content of the window has any layout views that can scroll their contents. If there is such a view, the window will be resized, on the assumption that scrolling can make all of the window’s contents visible within a smaller area.
adjustResize:这个是指重新修改窗口大小,来让键盘显现出来,建议界面使用滚动条,以让键盘弹出来的时候,可以让界面显示到最下面。
adjustPan:这个是不改变窗口大小,而是将窗口移动来给键盘留出空间。

如果需要动态地设置键盘
可以使用Context的方法:

InputMethodManager imm = (InputMethodManger) context.getSystemService(Context.INPUT_METHOD_SERVICE);

这样获取了imm来控制软件盘,隐藏软件盘。

imm.hideSoftInputFromWindow(IBinder windowToken,int flags);
//一般使用的方式是。
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS)

显示软键盘为:

imm.showSoftInput(View view,int flags);
//flags 其实就是键盘的那些状态

Android软件盘使用过程中出现无效的问题

  1. 首先说一个网友说的误解的问题:当窗口设置为全屏模式的时候,软件盘的adjustResize 是无效的。

网上的解决办法是,在弹出键盘前取消全屏显示,取消键盘后,再次使用全屏。(动态设置全屏)

  1. 然后跟ActivityGroup(包括其子类,如TabActivity)一起使用的使用,有时候你就会觉得莫名其妙,设置那些参数无效。

建议认真查看父Activity的windowSoftInput设置跟子Activity的windowSoftInput设置。如果在子Activity里面设置了,但是无效,其实可能是因为ActivityGroup中没有设置,而此时键盘的控制在ActivityGroup,所以在子Activity 中设置自然是无效的。我就是出现了这种情况。

  1. 遇到这种情况认真地思考思考,找出差异,然后就能够发现原因并且解决问题。

参考

###

善不积,不足以成名 ——《周易 系辞下》