Android 自定义 省份、车牌号键盘。

来源:互联网 发布:淘宝异地登录有提示吗 编辑:程序博客网 时间:2024/06/04 23:52


1.配省份、车牌号kebord数据源。

首先在资源目录res文件夹下创建xml文件夹。

明明省份数据源:

number_or_letters.xml:

<?xml version="1.0" encoding="utf-8"?><Keyboard android:keyWidth="10%p" android:keyHeight="8%"          android:horizontalGap="0.0px" android:verticalGap="0.0px"          xmlns:android="http://schemas.android.com/apk/res/android">              <Row android:verticalGap="1%p">      <Key android:codes="49" android:keyLabel="1"           android:horizontalGap="1%p" android:keyWidth="8%p"            android:keyEdgeFlags="left"  />      <Key android:codes="50" android:keyLabel="2"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="51" android:keyLabel="3"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="52" android:keyLabel="4"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="53" android:keyLabel="5"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="54" android:keyLabel="6"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="55" android:keyLabel="7"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="56" android:keyLabel="8"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="57" android:keyLabel="9"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="48" android:keyLabel="0"            android:horizontalGap="2%p" android:keyWidth="8%p"           android:keyEdgeFlags="right"/>   </Row>      <Row android:verticalGap="1%p">      <Key android:codes="81" android:keyLabel="Q"           android:horizontalGap="1%p" android:keyWidth="8%p"           android:keyEdgeFlags="left" />      <Key android:codes="87" android:keyLabel="W"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="69" android:keyLabel="E"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="82" android:keyLabel="R"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="84" android:keyLabel="T"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="89" android:keyLabel="Y"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="85" android:keyLabel="U"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="73" android:keyLabel="I"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="79" android:keyLabel="O"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="80" android:keyLabel="P"            android:horizontalGap="2%p" android:keyWidth="8%p"           android:keyEdgeFlags="right" />   </Row>      <Row android:verticalGap="1%p">      <Key android:codes="65" android:keyLabel="A"           android:horizontalGap="6%p" android:keyWidth="8%p"           android:keyEdgeFlags="left"/>      <Key android:codes="83" android:keyLabel="S"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="68" android:keyLabel="D"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="70"  android:keyLabel="F"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="71" android:keyLabel="G"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="72"  android:keyLabel="H"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="74" android:keyLabel="J"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="75" android:keyLabel="K"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="76"  android:keyLabel="L"          android:horizontalGap="2%p" android:keyWidth="8%p"          android:keyEdgeFlags="right" />   </Row>      <Row >       <Key android:codes="-1"    android:keyLabel="省份"           android:keyWidth="13%p" android:keyEdgeFlags="left"          android:isModifier="true" android:isSticky="true"  />      <Key android:codes="90" android:keyLabel="Z"           android:horizontalGap="3%p" android:keyWidth="8%p"/>      <Key android:codes="88" android:keyLabel="X"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="67" android:keyLabel="C"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="86" android:keyLabel="V"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="66" android:keyLabel="B"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="78" android:keyLabel="N"            android:horizontalGap="2%p" android:keyWidth="8%p"/>      <Key android:codes="77" android:keyLabel="M"            android:horizontalGap="2%p" android:keyWidth="8%p"           />      <Key  android:codes="-3"          android:keyEdgeFlags="right" android:keyIcon="@drawable/remove_edittext_data"          android:horizontalGap="3%p" android:keyWidth="13%p"          android:isRepeatable="true" />   </Row>        </Keyboard> 
province_abbreviation.xml:

<?xml version="1.0" encoding="utf-8"?><Keyboard        android:keyWidth="10%p" android:keyHeight="8%p"          android:horizontalGap="0.0px" android:verticalGap="0.0px"          xmlns:android="http://schemas.android.com/apk/res/android">              <Row android:verticalGap="1%p">      <Key android:codes="20140" android:keyLabel="京"           android:horizontalGap="1%p" android:keyWidth="8%p"            android:keyEdgeFlags="left"  />      <Key android:codes="27941" android:keyLabel="津"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="20864" android:keyLabel="冀"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="40065" android:keyLabel="鲁"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="26187" android:keyLabel="晋"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="33945" android:keyLabel="蒙"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="36797" android:keyLabel="辽"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="21513" android:keyLabel="吉"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="40657" android:keyLabel="黑"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="27818" android:keyLabel="沪"            android:horizontalGap="2%p" android:keyWidth="8%p"           android:keyEdgeFlags="right"/>   </Row>      <Row android:verticalGap="1%p">      <Key android:codes="33487" android:keyLabel="苏"           android:horizontalGap="1%p" android:keyWidth="8%p"           android:keyEdgeFlags="left" />      <Key android:codes="27993" android:keyLabel="浙"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="30358" android:keyLabel="皖"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="38397" android:keyLabel="闽"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="36195" android:keyLabel="赣"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="35947" android:keyLabel="豫"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="37122" android:keyLabel="鄂"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="28248" android:keyLabel="湘"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="31908" android:keyLabel="粤"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="26690" android:keyLabel="桂"            android:horizontalGap="2%p" android:keyWidth="8%p"           android:keyEdgeFlags="right" />   </Row>      <Row android:verticalGap="1%p">      <Key android:codes="28189" android:keyLabel="渝"           android:horizontalGap="11%p" android:keyWidth="8%p"           android:keyEdgeFlags="left"/>      <Key android:codes="24029" android:keyLabel="川"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="36149" android:keyLabel="贵"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="20113"  android:keyLabel="云"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="34255" android:keyLabel="藏"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="38485"  android:keyLabel="陕"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="29976" android:keyLabel="甘"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="38738"  android:keyLabel="青"          android:horizontalGap="2%p" android:keyWidth="8%p"          android:keyEdgeFlags="right" />   </Row>      <Row >       <Key android:codes="-1"    android:keyLabel="ABC"           android:keyWidth="13%p" android:keyEdgeFlags="left"          android:isModifier="true" android:isSticky="true"  />      <Key android:codes="29756"     android:keyLabel="琼"           android:horizontalGap="8%p" android:keyWidth="8%p"/>      <Key android:codes="26032" android:keyLabel="新"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="23425" android:keyLabel="宁"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="28207" android:keyLabel="港"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="28595" android:keyLabel="澳"           android:horizontalGap="2%p" android:keyWidth="8%p" />      <Key android:codes="21488" android:keyLabel="台"            android:horizontalGap="2%p" android:keyWidth="8%p"/>      <Key  android:codes="-3"          android:keyEdgeFlags="right" android:keyIcon="@drawable/remove_edittext_data"          android:horizontalGap="8%p" android:keyWidth="13%p"          android:isRepeatable="true" />   </Row>        </Keyboard> 

接下来,在drawable 目录下定义按键背景:

click_key_bg.xml:

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" >   <corners android:radius="5dp"/>  <solid android:color="@color/color_first_green" />         </shape>
did_not_click_key_bg.xml:

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" >   <corners android:radius="5dp"/>  <solid android:color="#ffffff" />         </shape>

----------关键部分:Z

界面部分

<android.inputmethodservice.KeyboardView    android:id="@+id/keyboard_view"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:paddingTop="8dp"    android:paddingBottom="8dp"    android:focusable="true"    android:focusableInTouchMode="true"    android:background="#999999"    android:keyBackground="@drawable/btn_keyboard_key"    android:keyTextSize="16sp"    android:keyTextColor="#000"    android:visibility="gone" />
Keyboard_Util:

public class Keyboard_Util {    private Context mContext;    private Activity mActivity;    private KeyboardView mKeyboardView;    private EditText mEdit;    /**     * 省份简称键盘     */    private Keyboard province_keyboard;    /**     * 数字与大写字母键盘     */    private Keyboard number_keyboar;    /**     * 软键盘切换判断     */    private boolean isChange = true;    /**     * 判定是否是中文的正则表达式 [\\u4e00-\\u9fa5]判断一个中文 [\\u4e00-\\u9fa5]+多个中文     */    private String reg = "[\\u4e00-\\u9fa5]";    public Keyboard_Util(Activity activity, EditText edit) {        mActivity = activity;        mContext = (Context) activity;        mEdit = edit;        province_keyboard = new Keyboard(mContext, R.xml.province_abbreviation);        number_keyboar = new Keyboard(mContext, R.xml.number_or_letters);        mKeyboardView = (KeyboardView) activity.findViewById(R.id.keyboard_view);        mKeyboardView.setKeyboard(province_keyboard);        mKeyboardView.setEnabled(true);        mKeyboardView.setPreviewEnabled(false);        mKeyboardView.setOnKeyboardActionListener(listener);    }    private KeyboardView.OnKeyboardActionListener listener = new KeyboardView.OnKeyboardActionListener() {        @Override        public void swipeUp() {        }        @Override        public void swipeRight() {        }        @Override        public void swipeLeft() {        }        @Override        public void swipeDown() {        }        @Override        public void onText(CharSequence text) {        }        @Override        public void onRelease(int primaryCode) {        }        @Override        public void onPress(int primaryCode) {        }        @Override        public void onKey(int primaryCode, int[] keyCodes) {            Editable editable = mEdit.getText();            int start = mEdit.getSelectionStart();            if (primaryCode == -1) {                if (mEdit.getText().toString().matches(reg)) {                    changeKeyboard(true);                }            } else if (primaryCode == -3) {                if (editable != null && editable.length() > 0) {                    if(editable.length() == 1){                        changeKeyboard(false);                    }                    if (start > 0) {                        editable.delete(start - 1, start);                    }                }            } else {                editable.insert(start, Character.toString((char) primaryCode));                // 判断第一个字符是否是中文,是,则自动切换到数字软键盘                if (mEdit.getText().toString().matches(reg)) {                    changeKeyboard(true);                }            }        }    };    /**     * 按切换键时切换软键盘     *     */    public void changeKeyboard() {        if (isChange) {            mKeyboardView.setKeyboard(number_keyboar);        } else {            mKeyboardView.setKeyboard(province_keyboard);        }        isChange = !isChange;    }    /**     * 指定切换软键盘 isnumber false表示要切换为省份简称软键盘 true表示要切换为数字软键盘     */    public void changeKeyboard(boolean isnumber) {        if (isnumber) {            mKeyboardView.setKeyboard(number_keyboar);        } else {            mKeyboardView.setKeyboard(province_keyboard);        }    }    /**     * 软键盘展示状态     */    public boolean isShow() {        return mKeyboardView.getVisibility() == View.VISIBLE;    }    /**     * 软键盘展示     */    public void showKeyboard() {        int visibility = mKeyboardView.getVisibility();        if (visibility == View.GONE || visibility == View.INVISIBLE) {            mKeyboardView.setVisibility(View.VISIBLE);        }    }    /**     * 软键盘隐藏     */    public void hideKeyboard() {        int visibility = mKeyboardView.getVisibility();        if (visibility == View.VISIBLE) {            mKeyboardView.setVisibility(View.INVISIBLE);        }    }    /**     * 禁掉系统软键盘     */    public void hideSoftInputMethod() {        mActivity.getWindow().setSoftInputMode(                WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);        int currentVersion = android.os.Build.VERSION.SDK_INT;        String methodName = null;        if (currentVersion >= 16) {            // 4.2            methodName = "setShowSoftInputOnFocus";        } else if (currentVersion >= 14) {            // 4.0            methodName = "setSoftInputShownOnFocus";        }        if (methodName == null) {            mEdit.setInputType(InputType.TYPE_NULL);        } else {            Class<EditText> cls = EditText.class;            Method setShowSoftInputOnFocus;            try {                setShowSoftInputOnFocus = cls.getMethod(methodName,                        boolean.class);                setShowSoftInputOnFocus.setAccessible(true);                setShowSoftInputOnFocus.invoke(mEdit, false);            } catch (NoSuchMethodException e) {                mEdit.setInputType(InputType.TYPE_NULL);                e.printStackTrace();            } catch (IllegalAccessException e) {                e.printStackTrace();            } catch (IllegalArgumentException e) {                e.printStackTrace();            } catch (InvocationTargetException e) {                e.printStackTrace();            }        }    }}
前面的准备工作做好,之后就将他们组合起来,下面看操作:

private Keyboard_Util keyboardUtil;
private EditText et_searchtxt;
注意,这里要绑定EditText来使用。

et_searchtxt = (EditText) findViewById(R.id.et_searchtxt);
et_searchtxt.setOnTouchListener(new View.OnTouchListener() {    @Override    public boolean onTouch(View view, MotionEvent event) {        rl_search.setVisibility(View.VISIBLE);        if(keyboardUtil == null){            keyboardUtil = new Keyboard_Util(Search_Activity.this, et_searchtxt);            keyboardUtil.hideSoftInputMethod();            keyboardUtil.showKeyboard();        }else {            keyboardUtil.showKeyboard();        }        return false;    }});et_searchtxt.addTextChangedListener(new TextWatcher(){    @Override    public void afterTextChanged(Editable s) {        Log.e("字符变换后", "afterTextChanged");    }    @Override    public void beforeTextChanged(CharSequence s, int start, int count, int after) {        Log.e("字符变换前",  s + "-" + start + "-" + count + "-" + after);    }    @Override    public void onTextChanged(CharSequence s, int start, int before, int count) {        Log.e("字符变换中", s + "-" + "-" + start + "-" + before + "-" + count);    }});
到这里就完成了。不懂的随时可以咨询和留言。

0 0