1、首先獲取佈局的根視圖View
View rootView = LayoutInflater.from(mContext).inflate(R.layout.layout_dialog_wlan_input_password, null);
2、獲取dailog中需要移動位置的佈局;
LinearLayout mLlWifiWlanInputPswContainer = rootView.findViewById(R.id.rl_wifi_wlan_input_psw_container);
3、在dialog的show方法中添加監聽
// 監聽軟鍵盤彈起/隱藏
rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//獲取當前根視圖在屏幕上顯示的大小
Rect r = new Rect();
rootView.getWindowVisibleDisplayFrame(r);
int visibleHeight = r.height();
// 初始化時,根視圖按設置大小顯示
if (rootViewLastVisibleHeight == 0) {
rootViewLastVisibleHeight = visibleHeight;
return;
}
//根視圖顯示高度沒有變化,可以看作是軟鍵盤顯示/隱藏狀態沒有改變
if (rootViewLastVisibleHeight == visibleHeight) {
return;
}
//上次顯示比目前顯示的高度大,可以看作軟鍵盤顯示了,200 爲鍵盤的高度
if (rootViewLastVisibleHeight - visibleHeight > 200) {
mLlWifiWlanInputPswContainer.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL);
mLlWifiWlanInputPswContainer.setPadding(0, 80, 0, 0);
rootViewLastVisibleHeight = visibleHeight;
return;
}
//上次顯示沒有當前顯示的高度大,可以看做軟鍵盤隱藏了,200 爲鍵盤的高度
if (visibleHeight - rootViewLastVisibleHeight > 200) {
mLlWifiWlanInputPswContainer.setGravity(Gravity.CENTER);
mLlWifiWlanInputPswContainer.setPadding(0, 0, 0, 0);
rootViewLastVisibleHeight = visibleHeight;
return;
}
}
});
到此就完事了。。。。,基本核心就是監聽根視圖的顯示大小與上次顯示的大小作對比,利用根視圖的繪製完成的監聽實現。
顯示鍵盤
mEtWifiWlanPassword.setFocusableInTouchMode(true);
mEtWifiWlanPassword.setClickable(true);
mEtWifiWlanPassword.setVisibility(View.VISIBLE);
mEtWifiWlanPassword.requestFocus();
InputMethodManager manager = ((InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE));
if (manager != null) {
manager.showSoftInput(mEtWifiWlanPassword, 0);
}
隱藏鍵盤
InputMethodManager localInputMethodManager = (InputMethodManager) SystemServiceFactory.getSystemService(getContext(), INPUT_METHOD_SERVICE);
if (localInputMethodManager != null && mEtWifiWlanPassword != null) {
localInputMethodManager.hideSoftInputFromWindow(mEtWifiWlanPassword.getWindowToken(), 0);
}