一、寫此文章的起因
本人在做類似於微信、易信等這樣的聊天軟件時,遇到了一個問題。聊天界面最下面一般類似於如圖1這樣(這裡只是顯示了最下面部分,可以參考微信等),有輸入文字的EditText和表情按鈕等。
1、點擊表情會在這下面顯示表情選擇,如圖2,如果之前點擊輸入框彈出了軟鍵盤,那麼還需要隱藏軟鍵盤;
2、點擊輸入框,彈出軟鍵盤,如果之前顯示了表情選擇,則還需要隱藏表情選擇。
這裡我們第一想到的就是需要監聽軟鍵盤的顯示和隱藏,我也是這樣想的,到網上一查,都是重寫根布局,比如LinearLayout,RelativeLayout這些,然後重寫OnLayout方法,這種主要是監聽根布局高度的變化,來判斷軟鍵盤的顯示和隱藏,我這樣做了,但是像華為p6這樣的手機,它有一個虛擬的home,back鍵,可以通過向上向下滑動來顯示和隱藏,我在上面測試了一下,它的虛擬鍵和輸入法都判斷到了,我無法知道到底是哪個,所以我就捨棄了這個方法。在仔細參考了微信和易信時,發現了這種方法,簡單易用。
圖1
圖2
二、解決方案
我針對第一點中提到了兩點需要實現的功能來講解
1、點擊表情隱藏輸入法,我們只需要強制隱藏輸入法就可以了,這個不需要過多講解
//強行隱藏輸入法
inputMethodManager.hideSoftInputFromWindow(mEditTextContent.getWindowToken(), 0);
2、點擊輸入框,輸入法彈出來後,需要隱藏表情選擇,其實這裡不需要監聽軟鍵盤的顯示,也不好監聽。我仔細觀察了易信和微信的輸入框,感覺很靈敏,觸摸上去就彈出了輸入法,而我的輸入框就沒那麼靈敏,所以就仔細考慮了一下,直接設置輸入框的Touch事件,主動強制彈出輸入法,這時就可以隱藏表情選擇了.
mEditTextContent.setOnTouchListener(new View.OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
//強制顯示軟鍵盤
boolean bool = inputMethodManager.showSoftInput(v,InputMethodManager.SHOW_FORCED);
if(bool){
chatAdd.setVisibility(View.GONE);
layoutChatFace.setVisibility(View.GONE);
}
return false;
}
});
如果這裡覺得太靈敏,也可以在Touch事件中,但Up時再顯示軟鍵盤。這些只是我的一些個人見解,如有疑問或更好方案大家可以一起討論。