Android中EditText+Button組合導(dǎo)致輸入板無法收起的原因分析及解決辦法
在Android開發(fā)中,錄入信息是最基本的操作,使用非常廣泛。
但是Android對(duì)輸入法彈出/收起的支持,并不是很好。
對(duì)彈出,提供了force方式和implicit方式,對(duì)輸入?yún)s沒有提供force方式。
可想而知,想彈能彈,想收不能收,這是多么的痛苦!
沒有對(duì)輸入法做任何處理的情況下,EditText輸入后,點(diǎn)擊Button一般會(huì)自動(dòng)收起輸入法。
若沒有收起,那可能是布局上有一些問題,可以嘗試在最外層添加scrollView。
筆者親測(cè)在大部分情況下,嵌套scrollView是可行的。
如果上述方法仍然不能解決問題,又對(duì)輸入板的自動(dòng)收起很執(zhí)著(很不幸,PM一般都這么執(zhí)著),可以考慮下面這種方式
對(duì)EditText的修改
重寫EditText的onFocusChange方法,添加如下代碼
InputMethodManager manager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); if (!hasFocus) { manager.hideSoftInputFromWindow(getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } else { manager.showSoftInput(this, ); }
這段代碼保證了EditText在獲取焦點(diǎn)時(shí)彈出輸入法,失去焦點(diǎn)時(shí)能夠關(guān)閉輸入法。
對(duì)Button的修改
在onClick方法中調(diào)用如下方法,并在調(diào)用后進(jìn)行業(yè)務(wù)處理
public static void obtainFocus(View v) { v.setFocusableInTouchMode(true); v.requestFocus(); v.setFocusableInTouchMode(false); }
通過上述兩端代碼,點(diǎn)擊Button之后輸入板能夠正常收起。
但是進(jìn)入頁面讓輸入板彈出,這個(gè)就需要單獨(dú)處理了。
原理
EditText部分
通過監(jiān)聽焦點(diǎn)變化,進(jìn)行輸入板的展示和隱藏。
焦點(diǎn)變化通過View.onFucusChange方法監(jiān)聽即可。
Button部分
當(dāng)點(diǎn)擊Button之后,首先獲取焦點(diǎn),之后再進(jìn)行業(yè)務(wù)處理。
點(diǎn)擊事件通過View.onClickListener注冊(cè)即可。
大家可能對(duì)setFocusableInTouchMode調(diào)用兩次有疑問,其實(shí)調(diào)用兩次是為了能夠進(jìn)行多次requestFocus方法(requestFocus方法需要focusableInTouchMode為true)。
在FocusableInTouchMode為true的情況下,首次點(diǎn)擊Button會(huì)讓Button獲得焦點(diǎn),再次點(diǎn)擊才能回調(diào)onClick。
為了保證每次點(diǎn)擊均能回調(diào)onClick,我們首先設(shè)置focusableInTouchMode 為true,這樣便能夠調(diào)用requestFocus進(jìn)行焦點(diǎn)獲取,隨后設(shè)置focusableInTouchMode為false,保證下次點(diǎn)擊時(shí)仍然能正常相應(yīng)onClick。
- Android實(shí)現(xiàn)輸入法彈出時(shí)把布局頂上去和登錄按鈕頂上去的解決方法
- android虛擬鍵盤彈出遮擋登陸按鈕問題的解決方法
- Android防止按鈕過快點(diǎn)擊造成多次事件的解決方法
- Android Button 自帶陰影效果另一種解決辦法
- Android setButtonDrawable()的兼容問題解決辦法
- 實(shí)例詳解Android解決按鈕重復(fù)點(diǎn)擊問題
- Android開發(fā)軟鍵盤遮擋登陸按鈕的完美解決方案
- Android優(yōu)雅的方式解決軟鍵盤遮擋按鈕問題
- Android編程出現(xiàn)Button點(diǎn)擊事件無效的解決方法示例
相關(guān)文章
Android自定義View實(shí)現(xiàn)拖動(dòng)選擇按鈕
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)拖動(dòng)選擇按鈕的具體代碼,感興趣的小伙伴們可以參考一下2016-05-05ViewPager滑動(dòng)靈敏度調(diào)整的方法實(shí)力
這篇文章主要介紹了ViewPager滑動(dòng)靈敏度調(diào)整的方法實(shí)力,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10Android DrawableTextView圖片文字居中顯示實(shí)例
在我們開發(fā)中,TextView設(shè)置Android:drawableLeft一定使用的非常多,但Drawable和Text同時(shí)居中顯示可能不好控制,小編想到通過自定義TextView實(shí)現(xiàn),具體詳情大家參考下本文2017-03-03詳解Android Service與Activity之間通信的幾種方式
這篇文章主要介紹了詳解Android Service與Activity之間通信的幾種方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04android Socket實(shí)現(xiàn)簡(jiǎn)單聊天功能以及文件傳輸
這篇文章主要介紹了android Socket實(shí)現(xiàn)簡(jiǎn)單聊天功能以及文件傳輸,非常具有實(shí)用價(jià)值,有需要的朋友可以參考下。2017-02-02基于RxJava實(shí)現(xiàn)酷炫啟動(dòng)頁
本文介紹怎樣利用RxJava來實(shí)現(xiàn)Android的啟動(dòng)頁,啟動(dòng)頁的效果非???,有需要的朋友們可以參考。2016-07-07android教程使用webview訪問https的url處理sslerror示例
這篇文章主要介紹了android教程使用webview訪問https的url處理sslerror示例,大家參考使用吧2014-01-01Android使用ViewFlipper實(shí)現(xiàn)圖片切換功能
這篇文章主要為大家詳細(xì)介紹了Android使用ViewFlipper實(shí)現(xiàn)圖片切換功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07