android 键盘设置详解

来源:互联网 发布:软件架构设计模型 编辑:程序博客网 时间:2024/04/28 08:48

相信大家在初涉android键盘的时候都有过困惑,无论是在manifest中设置android:windowSoftInputMode,还是通过mDialog.getWindow().setSoftInputMode();设置,都有那么多类型,该怎么选;他们都有什么样的特性呢?
下面就对这些类型以activity做出说明(我们分页面view是否被嵌套在scrollview中,分别给出特性):

  • adjustResize

activity会在键盘有变动的时候重新计算布局,调用activity的onSizeChanged方法。在进入该activity时,键盘会自动弹起。
在包裹着ScrollView的时候,能够保证焦点露出;同时将ScrollView的最低边缘重新计算至键盘上边缘位置;而里面的view可以正常上下滑动,能够完全展示。
在不包裹的时候,则不能够保证焦点正常露出;如果EditText过于偏下,则可能会被胡乱地推上来,而布局上边缘不发生变化,因此不一定能看到编辑区。

图片

  • adjustPan

activity不会在键盘变化的时候重新计算布局。键盘不会自动弹出。
无论是否包裹着ScrollView,都能够保证焦点正常露出;如果焦点偏下,会被正常推上来,但上部会被推出window上边界,且均不能上下滑动。

图片

  • adjustNothing

键盘不会自动弹出;弹出的键盘会直接覆盖activity,不管焦点是否能被看到。
图片

  • adjustUnspecified

键盘不会自动推上来;能够保证焦点正常露出;
在包裹着ScrollView时,可上下滑动;否则不能滑动;
图片

  • stateAlwaysVisible

always 强调了回来的动作:即从Activity A到B,再回到A的时候的键盘状态。
该状态下,从B回到A时的键盘状态一定是弹起状态,无论A到B的时候A的键盘是什么状态。
(只关心返回状态)

图片

  • stateAlwaysHidden

跟stateAlwaysVisible相反,从B到A的键盘状态一定是关闭的,无论A到B的时候A的键盘是什么状态(只关心返回状态)

  • stateVisible

在进入Activity的时候,键盘自动弹出,返回时保持键盘当前状态不变(只关心进入状态)
图片

  • stateHidden

在进入Activity的时候,键盘自动收起,返回时包吃键盘当前状态不变(只关心进入状态)
图片

  • stateUnchanged

在进入Activity的时候,键盘状态保持当前状态不变

图片

  • stateUnspecified

未知,还没有弄清楚,在目的明确的情况下,不建议使用。

以上介绍的特性,都是在单独使用某一状态的时候所展现出来的。但是,我们注意到,上述类型可分为两类,即以adjustXXX开头的和以stateXXX开头的。
这两类标志其实是两个维度的设置,一个从布局维度,另一个从状态维度。因此往往可以进行组合使用;具体情况应根据设计要求来。

下面介绍键盘显示还是隐藏的显示地控制方法。
一般我们在activity中会这样使用

    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);    imm.toggleSoftInput(int showFlags, int hideFlags);

但是令人困惑的是,Flags有真么多,每一种都是什么含义呢?该怎么使用呢?下面就一一介绍每一种Flag的使用方法和含义。

  • HIDE_IMPLICIT_ONLY

    表示键盘除了在用户显示地调用,其余情况都应该是隐藏的。用于hideSoftInputFromWindow(IBinder, int)方法.

  • HIDE_NOT_ALWAYS

    表示键盘除了开始的时候被使用SHOW_FORCED 调用,正常情况下都应该是隐藏的。用于hideSoftInputFromWindow(IBinder, int)方法

  • RESULT_HIDDEN

    用于 showSoftInput(View, int, ResultReceiver) 和 hideSoftInputFromWindow(IBinder, int, ResultReceiver),即,有广播接收器的方法。
    广播接收到RESULT_HIDDEN,意味着键盘从显示到隐藏

  • RESULT_SHOWN

    广播接收器收到,意味着键盘从隐藏到展示

  • RESULT_UNCHANGED_HIDDEN

    广播接收器收到,意味着键盘状态没变,且为隐藏

  • RESULT_UNCHANGED_SHOWN

    广播接收器收到,意味着键盘状态没变,且为显示

  • SHOW_FORCED

    表示该键盘被人为吊起,用于方法showSoftInput(View view, int flag),应该由人为隐藏。

  • SHOW_IMPLICIT

    表示该键盘被自动吊起,不是被用户手动吊起。用于方法showSoftInput(View view, int flag)

上述状态,说白了是在键盘吊起的时候为其吊起的原因加上类别的,而这个类别不会影响到键盘是否弹起,而只会影响键盘是否会收回。比如,当键盘以SHOW_FORCE状态吊起时,如果设置了以HIDE_NOT_ALWAYS的收回策略,就不会被真正收回。因为,文档中显示,使用HIDE_NOT_ALWAYS一般情况下都会成功隐藏,只有在遇到以SHOW_FORCED吊起的键盘时无效。

因此,在显示地控制键盘吊起和关闭的时候,应进行以下调用:

imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,InputMethodManager.HIDE_NOT_ALWAYS);

当键盘关闭的时候调用该方法,表明我以SHOW_IMPLICIT的状态打开键盘,且应该以HIDE_NOT_ALWAYS的状态关闭。

当键盘经过上述过程开启时,再次调用该方法,表明我要以HIDE_NOT_ALWAYS的方式关闭该键盘,而这个键盘接受这样的关闭方式,因此可以正常关闭。

参考资料 Android手动显示和隐藏软键盘方法总结

0 0
原创粉丝点击