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); } });到這裏就完成了。不懂的隨時可以諮詢和留言。