天天看點

給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也可以讓自定義鍵盤寬度鋪滿。