騰訊雲互動直播1.8的demo 上面,在直播界面軟鍵盤會覆蓋輸入框,起初的想法是 動態設置輸入框 dialog 的位置,但是在demo 上修改之後,在小米,魅族,華爲等機器上是可以解決覆蓋的問題,但是在三星的機器上還是存在覆蓋的問題。有人可能遇到解決覆蓋問題了,但是監聽軟鍵盤失效了。就是關閉軟鍵盤dialog 沒有關閉。下面就是我的解決方案,先上圖:
問題1:軟鍵盤覆蓋dialog
在 setContentView 之前添加
//防止軟鍵盤遮擋住Dialog的輸入框
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE |
WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
即可解決軟鍵盤覆蓋的問題;
問題2:當輸入框彈出後點擊空白處關閉軟鍵盤和dialog
1.將dialog 的根佈局改爲 match_parent
2.除去 舊代碼中的 對根佈局的位置的監聽,增加 根佈局 onTouch的監聽事件
問題3:關閉輸入框或者按返回鍵 dialog 未關閉
按照1,2 步驟完成之後,發現 關閉輸入框或者按返回鍵 dialog 未關閉,會出現在 屏幕的底部,此時就需要監聽 根佈局 GlobalLayout的事件
在activity_live.xml 佈局中發現最上層的佈局是
<include
android:id="@+id/invite_views"
layout="@layout/invite_views"
android:layout_width="wrap_content"
android:layout_height="fill_parent" />
此時 對該佈局 做監聽事件就可以了 ;
注意 :OnGlobalLayoutListener 響應 的條件是 :
SoftInputMode 是 ADJUST_RESIZE,不然是無法監聽到位置的改變的。
//軟鍵盤的監聽
findViewById(R.id.invite_views).getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
//獲取當前界面可視部分
getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
//獲取屏幕的高度
int screenHeight = getWindow().getDecorView().getRootView().getHeight();
//此處就是用來獲取鍵盤的高度的, 在鍵盤沒有彈出的時候 此高度爲0 鍵盤彈出的時候爲一個正數
int heightDifference = screenHeight - r.bottom;
if(heightDifference <= 0 && mLastDiff > 0){
//軟鍵盤收起狀態
Log.d("AAAA","軟鍵盤 彈出之後收起了 Rect GlobalLayoutListener heightDifference="+heightDifference+",mLastDiff="+mLastDiff);
if(inputMsgDialog!=null && inputMsgDialog.isShowing()){
inputMsgDialog.dismiss();
}
}
mLastDiff = heightDifference;
}
});
至此,上述問題應該解決了。