最近項目需要用到自定義鍵盤,一個是放在webview中通過點選網頁中的編輯框彈出,一個是在dialog彈框顯示的時候彈出自定義鍵盤的,自定義鍵盤都是用popupwindow形式底部彈出的。
其中webview中的自定義鍵盤還好做些,就是要注意屏蔽掉系統鍵盤,用如下的方式即可,網頁裡面最好也能禁掉input的點選事件,保留焦點事件,否則有些裝置還是會彈出系統鍵盤的:
public static void hideKeyboard(Context context, View view) {
InputMethodManager imm = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
重點講一下dialog的彈出自定義鍵盤的問題,因為dialog是以視窗形式出現,如果我們設定popupwindow是依附與dialog來彈出肯定是不行的,鍵盤彈出的寬度隻有dialog的寬度,是以我們在設定鍵盤寬度時可以這麼寫:
public void showKeyBoard(@NonNull EditText editText) { //彈框鍵盤
mEdit = editText;
int visibility = keyboardLayout.getVisibility();
if (visibility == View.GONE || visibility == View.INVISIBLE) {
keyboardLayout.setVisibility(View.VISIBLE);
}
IBinder windowToken = editText.getWindowToken();
if (windowToken != null && windowToken.isBinderAlive()) {
Rect rect = new Rect();
editText.getRootView().getGlobalVisibleRect(rect);
Context editTextContext = editText.getContext();
Resources resources = editTextContext.getApplicationContext().getResources();
DisplayMetrics dm = resources.getDisplayMetrics();
int y = rect.bottom - dm.heightPixels;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
boolean isActivity = needAttachedInDecor(editText);
keyboardWindow.setAttachedInDecor(isActivity);
}
keyboardWindow.setTouchable(true);
keyboardWindow.showAtLocation(editText, Gravity.BOTTOM | Gravity.LEFT, 0, y);
keyboardWindow.update(keyboardWindow.getWidth(), keyboardWindow.getHeight());
}
}
重點是标紅的内容。
最重要的一點其實是我們的Dialog需要繼承的是AlertDialog,注意這個AlertDialog必須的引入必須是v7下的:
import android.support.v7.app.AlertDialog;
否則沒用,或者保留ActionBar也可以讓自定義鍵盤寬度鋪滿。