天天看點

android 自定義車牌号多框輸入

android 自定義車牌号多框輸入
android 自定義車牌号多框輸入

項目需求雙框輸入,流程分析下:

1、自定義布局、同時能夠确定我點選的code,來拼接點選的車牌号

2、自定義鍵盤類,添加輸入監聽,把輸入時可能出現的情況進行判斷,

3、輸入完成,隐藏鍵盤

1、布局檔案

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_marginTop="48dp">
    <EditText
        android:id="@+id/s_edit"
        android:layout_width="102dp"
        android:layout_height="50dp"
        android:gravity="center"
        android:background="@drawable/weight_bg"
        android:textSize="@dimen/text_18sp"
        android:maxLength="2"
        android:textColor="@color/black"
        android:hint="京A"
        android:text=""/>
    <EditText
        android:id="@+id/a_edit"
        android:layout_width="176dp"
        android:layout_height="50dp"
        android:layout_marginLeft="@dimen/margin_20dp"
        android:background="@drawable/weight_bg"
        android:textSize="@dimen/text_18sp"
        android:maxLength="5"
        android:textColor="@color/black"
        android:gravity="center"
        android:hint="00000"
        android:text=""/>
</LinearLayout>      

2、布局檔案一定要引入

<android.inputmethodservice.KeyboardView
    android:id="@+id/keyboard_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:background="#DCDCDC"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:keyBackground="@drawable/selector_key"
    android:keyTextColor="#000"
    android:keyTextSize="18sp"
    android:paddingBottom="8dp"
    android:paddingTop="8dp"
    android:shadowColor="#FFFFFF"
    android:shadowRadius="0.0"
    android:visibility="gone"/>      

3、KeyboardUtil類

import android.app.Activity;
import android.content.Intent;
import android.inputmethodservice.Keyboard;
import android.inputmethodservice.KeyboardView;
import android.text.Editable;
import android.text.InputType;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;


import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Created by Administrator on 2019/8/13.
 */

public class KeyboardUtil {

    private Activity mActivity;
    private KeyboardView mKeyboardView;
    private EditText mEdit[];
    private int currentEditText = 0;
    /**
     * 省份簡稱鍵盤
     */
    private Keyboard provinceKeyboard;
    /**
     * 數字與大寫字母鍵盤
     */
    private Keyboard numberKeyboard;

    public KeyboardUtil(Activity activity, EditText edit[]) {
        mActivity = activity;
        mEdit = edit;
        provinceKeyboard = new Keyboard(activity, R.xml.province_abbreviation);
        numberKeyboard = new Keyboard(activity, R.xml.number_or_letters);
        mKeyboardView = (KeyboardView) activity.findViewById(R.id.keyboard_view);
        mKeyboardView.setKeyboard(provinceKeyboard);
        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[currentEditText].getText();
            int start = mEdit[currentEditText].getSelectionStart();
            //判定是否是中文的正規表達式 [\\u4e00-\\u9fa5]判斷一個中文 [\\u4e00-\\u9fa5]+多個中文
            String reg = "[\\u4e00-\\u9fa5]";
            if (primaryCode == -1) {// 省份簡稱與數字鍵盤切換
                if(currentEditText == 0){
                    if (editable != null && editable.length() > 0) {
                        changeKeyboard(true);
                    } else{
                        if (mEdit[currentEditText].getText().toString().matches(reg)) {
                            changeKeyboard(false);
                        }
                    }
                }else{
                    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 if(primaryCode == -9){
                if(!mEdit[currentEditText].getText().toString().equals("無")) {
                    editable.append("挂");
                }
            }else if(primaryCode == -77){
                if(!mEdit[currentEditText].getText().toString().equals("無")){
                    editable.append("無");
                }
            }else if(primaryCode == -66){
                Intent intent = new Intent();
                intent.setAction("keyboardhide");
                mActivity.sendBroadcast(intent);
            }else{
                if(!mEdit[currentEditText].getText().toString().equals("無")){
                    editable.insert(start, Character.toString((char) primaryCode));
                    // 判斷第一個字元是否是中文,是,則自動切換到數字軟鍵盤
                    if (mEdit[currentEditText].getText().toString().matches(reg)) {
                        changeKeyboard(true);
                    }
                }
            }
        }
    };

    /**
     * 指定切換軟鍵盤 isNumber false表示要切換為省份簡稱軟鍵盤 true表示要切換為數字軟鍵盤
     */
    private  void changeKeyboard(boolean isNumber) {
        if (isNumber) {
            mKeyboardView.setKeyboard(numberKeyboard);
        } else {
            mKeyboardView.setKeyboard(provinceKeyboard);
        }
    }

    /**
     * 軟鍵盤展示狀态
     */
    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);
        }
    }
    /**
     * 點選那個edit
     */
    public void setTouchint(int editnum) {
        this.currentEditText = editnum;
    }

    /**
     * 軟鍵盤隐藏
     */
    public void hideKeyboard() {
        int visibility = mKeyboardView.getVisibility();
        if (visibility == View.VISIBLE) {
            changeKeyboard(false);
            mKeyboardView.setVisibility(View.GONE);
        }
    }

    /**
     * 禁掉系統軟鍵盤
     */
    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[currentEditText].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[currentEditText], false);
            } catch (NoSuchMethodException e) {
                mEdit[currentEditText].setInputType(InputType.TYPE_NULL);
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    }
}      

4、在res目錄下引入所需檔案R.xml.province_abbreviation,R.xml.number_or_letters

province_abbreviation:

<?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="-77" android:keyLabel="無"
            android:horizontalGap="6%p" android:keyWidth="8%p"
            android:keyEdgeFlags="left"/>
        <Key android:codes="28189" android:keyLabel="渝"
            android:horizontalGap="2%p" android:keyWidth="8%p"/>
        <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:keyEdgeFlags="left" android:keyLabel="ABC"
            android:horizontalGap="4%p" android:keyWidth="15%p"
            android:isModifier="true" android:isSticky="true"  />
        <Key android:codes="29756" android:keyLabel="瓊"
            android:horizontalGap="2%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:keyLabel="删除"
            android:horizontalGap="2%p" android:keyWidth="15%p"
            android:isRepeatable="false" />
    </Row>
</Keyboard>      

number_or_letters:

<?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="65" android:keyLabel="A"
    android:horizontalGap="1%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" />
<!--<Key android:codes="76"  android:keyLabel="L"-->
    <!--android:horizontalGap="2%p" android:keyWidth="8%p"-->
    <!--android:keyEdgeFlags="right" />-->
    <Key android:codes="-9"  android:keyLabel="挂"
        android:horizontalGap="2%p" android:keyWidth="8%p"
        android:keyEdgeFlags="right" />
</Row>

<Row >
<Key android:codes="-66"
    android:keyEdgeFlags="left" android:keyLabel="ok"
    android:horizontalGap="1%p" android:keyWidth="13%p"
    android:isModifier="true" android:isSticky="true" />
<Key android:codes="90" android:keyLabel="Z"
    android:horizontalGap="2%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:keyLabel="删除"
    android:horizontalGap="2%p" android:keyWidth="13%p"
    android:isRepeatable="false" />
</Row>
</Keyboard>      

5、在主activity使用他

keyboardUtil = new KeyboardUtil(SentryActivity.this,new EditText[]{s_edit,a_edit});      
s_edit.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent event) {
        keyboardUtil.setTouchint(0);//告訴後面我是第一個輸入框哦
        keyboardUtil.hideSoftInputMethod();
        if (keyboardUtil == null) {
            keyboardUtil.showKeyboard();
        } else {
            keyboardUtil.showKeyboard();
        }
        return false;
    }
});
a_edit.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent event) {
        keyboardUtil.setTouchint(1);//告訴後面我是第二個輸入框哦
        keyboardUtil.hideSoftInputMethod();
        if (keyboardUtil == null) {
            keyboardUtil.showKeyboard();
        } else {
            keyboardUtil.showKeyboard();
        }
        return false;
    }
});      

6、記得注冊廣播,在自定義鍵盤輸入完點選ok時,通知下隐藏輸入鍵盤

private LocalReceiver  mReceiver;
public class LocalReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        keyboardUtil.hideKeyboard();
    }
}
/**
 * 注冊廣播
 */
private void registerBroadcast() {
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("keyboardhide");
    mReceiver = new LocalReceiver();
    registerReceiver(mReceiver, intentFilter);
}      

7、有的時候需要點選實體鍵來進行隐藏,可能會和傳回關閉頁面沖突

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN
                && KeyEvent.KEYCODE_BACK == keyCode) {
            if(keyboardUtil.isShow()){
                keyboardUtil.hideKeyboard();
            }else{
                finishActivity();
            }
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }