1. 程式人生 > >Android 自定義鍵盤輸入內容監聽

Android 自定義鍵盤輸入內容監聽

 文章內容結構按照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編輯還不怎麼會搞,格式有點亂,帶來閱讀困擾,敬請見諒哦!