【转】Android软键盘的全面解析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【转】Android软键盘的全面解析相关的知识,希望对你有一定的参考价值。

参考技术A

软键盘其实是一个Dialog

InputMethodService为我们的输入法创建了一个Dialog,并且对某些参数进行了设置,使之能够在底部或者全屏显示。当我们点击输入框时,系统会对当前的主窗口进行调整,以便留出相应的空间来显示该Dialog在底部,或者全屏。

其实这段话我们经常在各种软键盘博客所看到,但是大家并不知道android是怎么为我们创建的这个Dialog,所以我先带大家来看下软键盘生成这块的源码,了解软键盘的生成流程。

我们先来看一下InputMethodService的继承关系:

因为InputMethodService属于服务,接下来我们先看一下服务的入口onCreate()方法:

通过上面的分析,我们怀疑这里的SoftInputWindow是软键盘弹出创建的Dialog对象,下面我们看下SoftInputWindow的源码。

看到这里大家就能明白了,为什么说软键盘就是一个Dialog。而且这里通过设置Gravity.BOTTOM来控制当前Dialog在Window中的位置。

在Android中,可以通过给Activity设置 windowSoftInputMode 这个属性来控制软键盘与Activity的主窗口的交互方式。

Activity 的主窗口与包含屏幕软键盘的窗口的交互方式,该属性的设置影响两个方面:

该设置必须是下面所列的值之一,或者是一个“state…”值加上一个“adjust…”值的组合,在任一组中设置多个值(例如,多个“state…”值)都会产生未定义结果。各值之间使用垂直条 (|) 分隔。

下面将通过例子来介绍 adjustNoting adjustUnspecified adjustResize adjustPan 在软键盘弹出的区别:

非滚动布局xml

点击最下面的EditText12

滚动布局xml

通过上面的例子,我们可以完全理解adjust系列的各个参数的作用。而软键盘的显示和隐藏这里面需要并不多,而且内容并不算复杂,大家回去自己尝试下就可以。

在日常开发中,如果需要将软键盘的Enter键更改为其他键,可以设置其 android:imeOptions 属性,这个属性可以控制软键盘的Enter键,以及横屏情况下的软键盘显示状态。

该设置必须是下面所列的值之一,或者是一个“action…”值加上一个“flag…”值的组合,在action…组中设置多个值(例如,多个“action…”值)都会产生未定义结果,而flag….可以设置多个。各值之间使用垂直条 (|) 分隔

控制软键盘上的Enter键

横屏下控制软键盘

总结一下:
这里大部分的属性,已经介绍完毕,如果英语好的同学,可以去看下官方文档,可以更好的理解,并且本文以搜狗输入法为实践,可能其他的输入法与其显示的不同,但是功能应该都是一样的。

而如果要在横屏状态不希望软键盘全屏显示最好是将flagNoFullscreen和flagNoExtractUi结合使用,这样体验上会更好

android:imeOptions=”flagNoFullscreen|flagNoExtractUi”

Android官网的Api

如果需要监听软键盘的右下角的按键,需要为EditText设置setOnEditorActionListener()监听:

上面的方式,只是展示了如何监听各个按键的方法,如果需要消费事件,则需要return true。

(1)第一次写这么长的博客,感觉会有一些不足,各位看官如果有不合理的地方,或者有误的地方请直接指出。

(2)本来想整理成一个Demo的,后来简单看来下,该有的几乎都贴出来了,有需要的可以按需复制就可以。

(3)写完这篇博客之后,感觉博客干货还是不多,所以定位这篇文章算是总结性质加上实际案例性质的博客。

(4)Android软键盘的总结就差不多到这里,希望各位看官,如果看到这里有收获,就点点赞,灌灌水,顶一波,这样博主才有写下去的动力。

(5)感谢小辉同学的校验,调整了文章中不通顺的地方。

1.彻底搞定Android开发中软键盘的常见问题
http://blog.csdn.net/mynameishuangshuai/article/details/51567357

2.Android UI(EditText)详解
http://blog.csdn.net/qq_28057577/article/details/51919965?locationNum=12&fps=1

3.微信软键盘布局闪动问题
https://blog.dreamtobe.cn/2015/09/01/keyboard-panel-switch/

以上是关于【转】Android软键盘的全面解析的主要内容,如果未能解决你的问题,请参考以下文章

Android 软键盘控制方法以及开发中遇到的一些问题。转

[转]软键盘用法总结

转Android开发之ListView+EditText-要命的焦点和软键盘问题解决办法

android中如何点击一个按钮时隐藏软键盘,(不是点击空白处隐藏软键盘)

Android软键盘弹出时把布局顶上去的解决方法

android 动态改变界面 软键盘覆盖了界面