Android 自定义键盘输入内容监听

来源:互联网 发布:南京it行业怎么样 编辑:程序博客网 时间:2024/06/08 13:03

 文章内容结构按照STAR法则展开的:


  situation:

                  为何要监听输入内容? 一般正常的监听键盘输入内容,都是用Editext控件来实现用户的输入内容显示。但是如果密码输入框设计成如下:

               

                             

                                                           


                都是类似的,需要对每个输入的字符或数字准确监听并放入到固定位置了,这个是Editext做不到的,它只负责把输入的内容依次显示在输入框内的横线上,不能有这么多种显示样式。


   Task:

          1、获取到键盘输入内容

                这个就是本文要讲的

          2、在监听到输入内容之后,立马绘制显示UI内容

                         具体如何绘制比较简单,本文就不过多展开

    

                       

  Action: 如何监听用户输入了内容

            1、间接方式(自己最初还真是这样做的)

                既然Editext实现了监听键盘输入,那何必不直接使用呢。那剩下的问题就是密码ui显示的问题,上午也讲了直接用Editext显示那么的不优雅,那就仅仅使用监听输入啊,显示单独绘制不就好了么。Editext.addTextChangedListener来监听每个字符输入。

                 当然这样就是偷懒了,有啥好讲的呢

            2、最直接的办法(自己用来仅仅当简单的数字输入)

                   直接实现输入键盘键盘,提供用户自己实现的键盘,直接监听用户的操作,这不是很简单么。具体就是点击的时候,从手机底部弹出自己实现输入键盘界面,为了逼真些,也要支持横竖切换,就需要动态布局按键了。所以当可以输入内容过多的话,实现起来也烦。

               这就不多展开了,也不是本文的重点,下面重点来了。

            3、直接监听系统输入法的输入内容值(本文重点,请不要怪我写了那么的废话,才到重点,不要打我)

                  我们知道点击屏幕事件TOUCHEVENT事件,系统会给每个view分发touch事件,那么按钮键盘点击事件也有啊,KEYEVENT,这里涉及到了keyEvent事件的分发,不展开,可以参考http://www.cnblogs.com/xiaoweiz/p/3803301.html。从本文中也可以看到,keyevent事件会传递到view的实现的keyEvent.CallBack接口中。回过头来看下Editext源码是如何实现对键盘内容的输入显示。发现实现全部在父类TextView中,直接定位其对onkeyDownd的实现如下:

            

                 

  在定位到doKeyDown方法,可以看到对keyEvent事件内进行解析分类:有back,enter,tab事件

          

        那输入内容呢,继续看:

         

    可以看到mKeyListener.onKeyOther(this, (Editable) mText, otherEvent);那这个又是那个实现了这个接口呢,定位发现在TextView初始化时候就进行赋值了:

   


 随便点开一个实现类TextKeyListener.getInstance()或者DialerKeyListener.getInstance()可以看到输入的内容的解析以及最终显示,不过多展开。

       总之可以发现源头在KEYevent.callBack的实现,且View实现了这个接口,故只要自定义这个一个view即可,然后在onkeyDown里面解析输入内容就可以实现了内容的监听了。或者直接在onkeyListener这个接口进行拦截


  在接口没有实现之后,event.dispatch在调用到onkeyDown...

   

 在KeyListener的实例子类中解析键盘值并输入,其中KeyEvent中keycode解析:


这样就可以完成对输入的监听了。

       如何点击弹出输入法,其实都可以模拟系统的实现:

在textView的onTouchEvent中有发现调起输入法

       

故同理。         

在失去焦点时隐藏软键盘,重写onWindowFocusChanged方法关闭输入法。 

最后模拟下EDITEXT功能有恢复数据能力:

重写onSaveInstanceState方法和onRestoreInstanceState对状态进行保存和恢复  


    好了,这么多了。刚写文章cdsn编辑还不怎么会搞,格式有点乱,带来阅读困扰,敬请见谅哦!

原创粉丝点击