最近项目需要用到自定义键盘,一个是放在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也可以让自定义键盘宽度铺满。