Android 自定義 省份、車牌號鍵盤。


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);



    }
});
到這裏就完成了。不懂的隨時可以諮詢和留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章