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