天天看点

给Dialog创建自定义键盘popupwindow

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