今天上午來到公司后。測試項目時發現好友頁面的搜索好友功能。只可以彈出一次軟鍵盤,當第一次手動關閉后,第二次死也彈不出來了。當然,我認為這和實時查詢的代碼邏輯有關系。
實時查詢功能是當頁面打開后就根據輸入框的值查詢好友,每300毫秒間隔查詢一次(別問我為什么這么寫,藍瘦香菇)。頁面打開后輸入框不獲取焦點,當手指觸摸一下輸入框才會獲取焦點并打開軟鍵盤,這時就可以輸入關鍵字查詢自己的好友了。但是如果自己手動關閉掉軟鍵盤,那可就玩兒完了。除非你重新進入這個頁面,否則軟鍵盤是再也彈不出來了。這讓我感到很郁悶。
首先嘗試了判斷軟件盤狀態的方法,如果關閉,則再次點擊輸入框就打開,但是事與愿違。我發現給EditText加了addTextChangedListener(TextWatcher watcher),onClick方法就無效了。這個方法似乎行不通。
接下來嘗試監聽EditText焦點變化事件,一旦得到焦點則馬上開啟軟鍵盤。想法是好想法,但是因為有個300毫秒間隔查詢,我是在執行查詢方法的時候關閉軟鍵盤的同時清除焦點,這樣道理上應該是可以了。結果出現了閃彈閃退的現象。因為我剛失去焦點時候,我點擊了EditText獲得焦點,軟件盤彈出來,但是300毫秒馬上就到,于是軟鍵盤又馬上關閉了。。。唉:-(。
后來,我絞盡腦汁,想出了一個規避手動點擊軟鍵盤上那個關閉的標識,我用代碼讓它自動關閉。就是每當根據關鍵字查詢并返回數據的時候,自動調用我的關閉軟鍵盤的代碼,用戶就沒有機會自己點擊關閉了。這樣的確解決了,二次點擊不彈出的問題。但是還是存在一個小bug,那就是如果用戶什么都不輸入,就自己手動關閉軟件盤,我的這個方法就是失靈了。當用戶再次點擊輸入框時候,軟鍵盤還是不會彈出的,那該怎么辦呢?沒辦法,我不得不又耍了一次小聰明,因為朋友列表是ListView顯示的,所以我決定只要listview有滑動,則EditText的焦點就清除。也算是方便了用戶吧。
最后,我就這么不完美的解決了這個小bug,當然隨著我經驗的增長,也許以后我會知道該怎么解決這個問題。到時候,我會再來改這篇文章,如果,我還能想起來的話。
6天之后,我又回來了。昨天測試的時候,發現因為每次實時查詢完數據就關閉導致我的關鍵字輸不了幾個字軟鍵盤就自動關閉了。這簡直不能忍,我要是用戶,都想罵程序員,于是,我決定再次修改這個功能。仔細想下為什么輸入法彈不出來,清除焦點之后可以彈出來,所以重點就是什么時候清除焦點合適。
這回一開始我想的是監聽EditText的setOnKeyListener(),之后測試了一下,雖然能攔截到KeyEvent.KEYCODE_ENTER和keyEvent.KEYCODE_DEL兩個輸入法按鍵的動作,但是并沒什么卵用。我無法通過攔截到的這些動作,判斷什么時候清除EditText的焦點。
于是我改變思路,采用終極大法,監聽EditText觸摸事件,即:setOnTouchListener(),這個事件一測試,簡直完美!我在MotionEvent.ACTION_DOWN的時候,馬上清除焦點,MotionEvent.ACTION_UP的時候,焦點會自動再次加上,輸入法隨之彈出,當看到這個效果的時候,我真的高興極了,反復測試了幾遍,的確一點問題沒有。
至此,這個bug徹底解決。