Android 判斷軟鍵盤彈出並隱藏的簡單完美解決方案


  最近項目中有一個編輯框,下面是個ListView。在觸發編輯框彈出軟鍵盤后,ListView還能滑動,並且ListView的item還能響應單擊。這樣的體驗效果很不好。於是便想在滑動或單擊item時判斷鍵盤是否彈出,若彈出,則把它隱藏。

  網上一搜,發現Android並沒有直接提供軟鍵盤的彈出與隱藏判斷,一些解決方案諸如判斷父控件的高度或者判斷

if(getWindow().getAttributes().softInputMode==WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN)
  隱藏鍵盤;

的方法並沒有用,於是便從官方文檔着手。

  發現InputMethodManager有一個方法isActive(View view):如果view是輸入法的活動view,則返回true。也就是說,如果是由view觸發彈出軟鍵盤,則返回true。哇,那問題就好辦了

if(isActive(edittext))
    隱藏鍵盤

然而,第一次彈出鍵盤后再進行其它觸摸操作,鍵盤確實消失了。但這個時候再進行其它觸摸操作(即單擊item),view的輸入仍是激活的。因為我的代碼中item的單擊事件是

public void onItemClick(...){
  if(isActive(edittext)){
    隱藏鍵盤
  }else{
    其它操作
  }
}

 所以我的item的其它操作並沒有執行。再看看InputMethodManager的函數,找到一個函數restartInput(View view):如果當前輸入法與view連接,用新內容重啟輸入法。重啟?那么view的輸入法將變成默認的未激活咯?於是便在隱藏輸入法后面加入了這個函數,果然,成功了。

  這個方法比較簡單,代碼比較短,也很好理解,希望能夠幫助有需要的人,也不枉費我調試幾個小時的功夫。

  附上代碼:

InputMethodManager inputMethodManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
private boolean hideKeyboard(){
        if(inputMethodManager.isActive(searchEditText)){
          //因為是在fragment下,所以用了getView()獲取view,也可以用findViewById()來獲取父控件
            getView().requestFocus();//強制獲取焦點,不然getActivity().getCurrentFocus().getWindowToken()會報錯
            inputMethodManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
            inputMethodManager.restartInput(searchEditText);
            return true;
        }
        return false;
    } 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM