相信大家在初涉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手动显示和隐藏软键盘方法总结

更多相关文章

  1. ubuntu 编译 Android 出现的若干错误及解决方法
  2. 解决EventBus中接收方法中无法更新UI的问题
  3. Android保持屏幕常亮的三种方法
  4. Android .so abi兼容,通用armeabi-v7a和arm64-v8a架构的方法
  5. Android 首选网络模式默认值的修改方法
  6. Android 软键盘弹出 【遮挡输入框】【遮挡RecyclerView】的问题
  7. android的frameworks层键盘事件处理流程分析

随机推荐

  1. android 触摸事件、点击事件的区别
  2. SignalR推送消息到android客户端
  3. Android Mms专题之:PDU介绍
  4. 分享两本android电子书
  5. Android 系统framework 概述【转载】
  6. android network,gps定位切换
  7. android studio proguard 混淆微信libamm
  8. Android studio 2.3.3+Dlib
  9. Android 安全机制概述 Permission
  10. Android: 向最强看齐, 反编译 植物大战僵