最近在做物流的项目,需要输入车牌号,传统的输入体验并不好,来回切换还要手打,便有了自定义键盘的想法。
其实这个车牌需求并不多见,物流、租车、停车相关的会常见一些,好在有前辈已经铺好路了
这个比较详细:
https://blog.csdn.net/dgs960825/article/details/50344743
1.在res文件夹下新建xml文件夹,新建两个文件:number_or_letters.xml(数字和大写字母)、province_abbreviation.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 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 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" />
<Key android:codes="-1"
android:keyEdgeFlags="left" android:keyLabel="省份"
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" />
</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>
<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>
2.新建键盘工具类KeyboardUtil(初始化、交互、显示和隐藏)
package yechaoa.com.platenumberkeyboard;
import android.app.Activity;
import android.content.Context;
import android.inputmethodservice.Keyboard;
import android.inputmethodservice.KeyboardView;
import android.text.Editable;
import android.text.InputType;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
* Created by yechao on 2018/5/15/015.
* Describe :
public class KeyboardUtil {
private Activity mActivity;
private KeyboardView mKeyboardView;
private EditText mEdit;
* 省份简称键盘
private Keyboard provinceKeyboard;
* 数字与大写字母键盘
private Keyboard numberKeyboard;
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.getText();
int start = mEdit.getSelectionStart();
String reg = "[\\u4e00-\\u9fa5]";
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);
* 指定切换软键盘 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);
* 软键盘隐藏
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) {
methodName = "setShowSoftInputOnFocus";
} else if (currentVersion >= 14) {
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();
3.Activity引用
package yechaoa.com.platenumberkeyboard;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
private KeyboardUtil keyboardUtil;
private EditText mEditText;
@SuppressLint("ClickableViewAccessibility")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditText = findViewById(R.id.edit_text);
mEditText.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
if (keyboardUtil == null) {
keyboardUtil = new KeyboardUtil(MainActivity.this, mEditText);
keyboardUtil.hideSoftInputMethod();
keyboardUtil.showKeyboard();
} else {
keyboardUtil.showKeyboard();
return false;
mEditText.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
Log.i("字符变换后", "afterTextChanged");
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
Log.i("字符变换前", s + "-" + start + "-" + count + "-" + after);
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Log.i("字符变换中", s + "-" + "-" + start + "-" + before + "-" + count);
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (keyboardUtil.isShow()) {
keyboardUtil.hideKeyboard();
} else {
finish();
return false;
4.相关属性
android:keyBackground=”@drawable/selector_key”
* 按键的背景颜色
android:shadowColor=”#FFFFFF”
android:shadowRadius=”0.0”
* 不加这两个属性 文字会出现模糊
android:keyTextColor=”#000”
* 字体颜色
android:keyTextSize=”18sp”
* 字体大小
android:keyIcon=”@drawable/ic_delete”
* 按键上的图标
android:codes=”20140”
* 输出的内容 对照ASCII表
android:keyLabel=”京”
* 按键上显示的内容
android:horizontalGap=”0px”
* 水平方向的间隙
android:verticalGap=”0px”
* 垂直反向的间隙
android:keyEdgeFlags=”right”
* 按键的对齐方式
github:https://github.com/yechaoa/PlateNumberKeyBoard
最近在做物流的项目,需要输入车牌号,传统的输入体验并不好,来回切换还要手打,便有了自定义键盘的想法。 其实这个车牌需求并不多见,物流、租车、停车相关的会常见一些,好在有前辈已经铺好路了 这个比较详细:https://blog.csdn.net/dgs960825/article/details/503447431.在res文件夹下新建xml文件夹,新建两个文件:...
最近在
android项目中,遇到需要
android车牌键盘的需求(需要支持普通
车牌,新能源,警车,军车,领事馆车,教练车以及特种车辆等
车牌)话不多说,分享一下
android车牌键盘效果图,以及源码1、
键盘控制器
2、
键盘布局xml文件
停车王车牌键盘 VehicleKeyboard - Android
VehicleKeyboard是停车王品牌的各端产品线的基础组件,专为提高中国车牌号码输入速度而定制开发的专用键盘组件。
为停车行业的用户输入车牌号码,提供非常便捷有效的输入方式。
包括以下三个项目:
Android Android项目,为Android客户端定制包括输入组件、键盘组件及相关控制逻辑实现;
iOS iOS客户端项目,为iOS客户端定制包括输入组件、键盘组件及相关控制逻辑实现;
JavaScript(Vue.js) JavaScript(Vue.js)项目,为H5页面定制,包括Web、微信、支付宝等,同样包括输入组件、键盘组件及相关控制逻辑实现
零、项目主页
Android 版本
GitHub项目主页
OSChina项目主页
iOS 版本
GitHub项目主页
OSChina项目主页
JavaScript Vue.js 版本
GitHub项目主页
OSChina项目主页
兼容性声明
当前版本v0.5,已修改为Java原生实现键盘逻辑,不再使用Javascript。项目包结构已发生重
uni-app是一种跨平台的开发框案,它可以让你使用一份代码开发出能在多个平台(包括微信小程序、支付宝小程序、H5、App等)运行的应用。
如果你想在uni-app小程序中使用车牌号键盘,你可以使用uni-app内置的组件`<keyboard/>`。这个组件可以让你自定义键盘的布局和样式,并且可以绑定输入事件,在用户按下键盘上的按键时触发事件。
例如,你可以在uni-app小程序的vue文件中使用如下代码定义车牌号键盘:
<template>
<input v-model="plateNumber" />
<keyboard @confirm="confirm" @cancel="cancel" :maxlength="7" :keyboardType="keyboardType" />
</view>
</template>
<script>
export default {
data() {
return {
plateNumber: '',
keyboardType: 'carNumber'
methods: {
confirm(e) {
this.plateNumber = e.value;
cancel(e) {
console.log('用户点击了取消按钮');
</script>
在这个例子中,我们使用了`<keyboard/>`组件的`keyboardType`属性来指定键盘的类型为"carNumber",这样就会使用车牌号键盘。在用户点击键盘上的确认按钮时,会触发`confirm`事件,在用户点击键盘上的取消按钮时,会触发`cancel`事件。
有关`<keyboard/>`
Gradle升级,Error:Connection timed out: connect. If you are behind an HTTP proxy, please configure
53675