上图上代码

public class MainActivity extends AppCompatActivity {

    EditText writebankcard_mobileedit;
CustomKeyboard mCustomKeyboard; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); writebankcard_mobileedit = (EditText) findViewById(R.id.writebankcard_mobileedit); //1 屏蔽掉系统默认输入法
if (Build.VERSION.SDK_INT <= 10) {
writebankcard_mobileedit.setInputType(InputType.TYPE_NULL);
} else {
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
try {
Class<EditText> cls = EditText.class;
Method setShowSoftInputOnFocus = cls.getMethod("setShowSoftInputOnFocus", boolean.class);
setShowSoftInputOnFocus.setAccessible(true);
setShowSoftInputOnFocus.invoke(writebankcard_mobileedit, false);
} catch (Exception e) {
e.printStackTrace();
}
} //2 初试化键盘
MyKeyboardView keyboardView = (MyKeyboardView) findViewById(R.id.customKeyboard);
mCustomKeyboard = new CustomKeyboard(MainActivity.this, keyboardView, writebankcard_mobileedit);
mCustomKeyboard.showKeyboard(); writebankcard_mobileedit.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mCustomKeyboard.showKeyboard();
return false;
}
});
} //物理返回键
@Override
public void onBackPressed() {
if (mCustomKeyboard.isShowKeyboard()){
mCustomKeyboard.hideKeyboard();
}else {
finish();
}
}
}
public class CustomKeyboard {

    private EditText mEdittext;
private MyKeyboardView mKeyboardView;
private Keyboard mKeyboard; public CustomKeyboard(Context context, MyKeyboardView keyboardView, EditText editText) {
this.mEdittext = editText;
mKeyboard = new Keyboard(context, R.xml.keyboard);//从xml中加载自定义的键盘
mKeyboardView = keyboardView;
mKeyboardView.setContext(context);
mKeyboardView.setKeyboard(mKeyboard);
mKeyboardView.setPreviewEnabled(false);
mKeyboardView.setOnKeyboardActionListener(actionListener);
} private KeyboardView.OnKeyboardActionListener actionListener = new KeyboardView.OnKeyboardActionListener() {
@Override
public void onPress(int primaryCode) {
} @Override
public void onRelease(int primaryCode) { } @Override
public void onKey(int primaryCode, int[] keyCodes) {
Editable editable = mEdittext.getText();
int index = mEdittext.getSelectionStart();//光标位置
switch (primaryCode) { case Keyboard.KEYCODE_DELETE://回退
if (editable != null && editable.length() > 0) {
if (index > 0) {
editable.delete(index - 1, index);
}
}
break;
case 9995://重输
mEdittext.setText("");
break;
case 9994://左移
if (index > 0) {
mEdittext.setSelection(index - 1);
}
break;
case 9996://右移
if (index < mEdittext.length()) {
mEdittext.setSelection(index + 1);
}
break;
default:
editable.insert(index, Character.toString((char) primaryCode));
break;
}
} @Override
public void onText(CharSequence text) { } @Override
public void swipeLeft() { } @Override
public void swipeRight() { } @Override
public void swipeDown() { } @Override
public void swipeUp() { }
}; public void showKeyboard() {
if (mKeyboardView.getVisibility() != View.VISIBLE) {
mKeyboardView.setVisibility(View.VISIBLE);
}
} public void hideKeyboard() {
if (mKeyboardView.getVisibility() == View.VISIBLE) {
mKeyboardView.setVisibility(View.GONE);
}
} public boolean isShowKeyboard() {
return mKeyboardView.getVisibility() == View.VISIBLE;
} }
public class MyKeyboardView extends KeyboardView {

    private Context context;

    public MyKeyboardView(Context context, AttributeSet attrs) {
super(context, attrs);
} public void setContext(Context context) {
this.context = context;
} @Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
/* List<Keyboard.Key> keys = getKeyboard().getKeys();
for(Keyboard.Key key: keys) {
if(key.label.equals("delete"))
resetOKBtn(key, canvas);
}*/
} /**
* 绘制OK键的点9图
* @author Song
* @param key
* @param canvas
*/
private void resetOKBtn(Keyboard.Key key, Canvas canvas) {
//将OK键重新绘制
/* Drawable npd = (Drawable) context.getResources().getDrawable(R.mipmap.icon_number_del);
npd.setBounds(key.x, key.y + 1, key.x + key.width, key.y + key.height + 1);
npd.draw(canvas);*/
}
}

键盘点击变色

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true" >
<color android:color="#d1d5db"/>
</item>
<item android:state_pressed="false" >
<color android:color="#ffffff"/>
</item>
</selector>

光标颜色

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<size android:width="2px" />
<solid android:color="#000000" />
</shape>

键盘

<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:horizontalGap="3px"
android:verticalGap="3px"
android:keyHeight="50dp"
android:keyWidth="33.33%p">
<Row>
<Key
android:codes="49"
android:keyLabel="1" />
<Key
android:codes="50"
android:keyLabel="2" />
<Key
android:codes="51"
android:keyLabel="3" />
</Row>
<Row>
<Key
android:codes="52"
android:keyLabel="4" />
<Key
android:codes="53"
android:keyLabel="5" />
<Key
android:codes="54"
android:keyLabel="6" />
</Row>
<Row>
<Key
android:codes="55"
android:keyLabel="7" />
<Key
android:codes="56"
android:keyLabel="8" />
<Key
android:codes="57"
android:keyLabel="9" />
</Row>
<Row>
<Key
android:codes="88"
android:keyLabel="X"
/>
<Key
android:codes="48"
android:keyLabel="0" />
<Key
android:codes="-5"
android:keyIcon="@mipmap/icon_number_del"/>
</Row>
</Keyboard>

demo地址 https://github.com/huanyi0723/VipKeyboardTest

Android 基于身份证号的自定义键盘的更多相关文章

  1. 银行卡号、电话号、身份证号 EditText 自定义格式的输入框

    package com.yidian.AddSpaceEditText;import android.text.Editable;import android.text.InputFilter;imp ...

  2. 基于struts2框架-自定义身份证号验证器

    自定义拦截器的步骤: 1.定义一个验证器的类: > 自定义的验证器都需要实现 Validator接口.  > 可以选择继承 ValidatorSupport 或 FieldValidato ...

  3. KeyboardDemo - Android身份证号、车牌号快捷输入键盘

    Android身份证号.车牌号快捷输入键盘 项目地址 Github 键盘部分在 keyboard module 中 键盘与EditText绑定参照 MainActivity

  4. 移动开发首页业界资讯移动应用平台技术专题 输入您要搜索的内容 基于Java Socket的自定义协议,实现Android与服务器的长连接(二)

    在阅读本文前需要对socket以及自定义协议有一个基本的了解,可以先查看上一篇文章<基于Java Socket的自定义协议,实现Android与服务器的长连接(一)>学习相关的基础知识点. ...

  5. android自定义键盘(解决弹出提示的字体颜色问题)

    最近准备要做一个项目,需要用到自定义小键盘来确保安全,而且还需要精确获得用户点击键盘时的落点位置.力度.指尖接触屏幕的面积等参数. 在写自定义键盘的时候,用到了国内网上的一些代码,出处是 向先人致敬! ...

  6. Laravel 中自定义 手机号和身份证号验证

    首先在 Providers\AppServiceProvider.php 文件中自定义 手机号和身份证号验证 // AppServiceProvider.php 文件 <?php namespa ...

  7. Android 正则表达式验证手机号、姓名(包含少数民族)、身份证号

    最近项目中新增的功能,需要对手机号.姓名.身份证号等一些信息进行验证,最好的方法是通过正则表达式来验证,网上查了一些资料,写了这几个工具方法. 1.验证手机号 规则:第一位只能是1,第二位为3-8中的 ...

  8. Android 使用正则表达式验证身份证号是否符合规则

    我国当前的身份证号分为三种: 一.15位身份证号 二.18位身份证号(前17位位数字,最后一位为字母x) 三.18为身份证号(18位都是数字) 具体验证请参考下面代码: /** * 验证身份证号是否符 ...

  9. bootstrap-validator基本使用(自定义验证身份证号和手机号)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

随机推荐

  1. java面向对象的有序数组和无序数组的比较

    package aa; class Array{ //定义一个有序数组 private long[] a; //定义数组长度 private int nElems; //构造函数初始化 public ...

  2. Scrum立会报告+燃尽图(Beta阶段第二周第三次)

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2411 项目地址:https://coding.net/u/wuyy694 ...

  3. 2018软工实践—Alpha冲刺(6)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 测试服务器并行能力 学习MSI.CUDA ...

  4. 第一次c++团队合作项目第三篇随笔

    这次终于想出来了上次问题的解决方法,就是用多态的方法,让小兵,建筑和英雄继承于Object类,通过指针能实现信息的传递. 同时我也完善了地图中每个Pane类的信息,包括每个格子的位置信息,state( ...

  5. HDU 5869 Different GCD Subarray Query rmq+离线+数状数组

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5869 Different GCD Subarray Query Time Limit: 6000/3 ...

  6. rsa加密算法,前后端实现。

    前端js: 下载地址:http://travistidwell.com/jsencrypt/ js第一版本: // 对数据加密 function encrypt(enStr){ //没有加载jsenc ...

  7. PAT 甲级 1043 Is It a Binary Search Tree

    https://pintia.cn/problem-sets/994805342720868352/problems/994805440976633856 A Binary Search Tree ( ...

  8. ZooKeeper系列文章

    ZooKeeper FAQ ZooKeeper客户端事件串行化处理 ZooKeeper分布式锁避免羊群效应(Herd Effect) ZooKeeper管理员指南——部署与管理ZooKeeper Zo ...

  9. selenium学习网址

    1.http://www.testclass.net/selenium_java/#      testclass网址 2.http://www.yiibai.com/selenium/seleniu ...

  10. BZOJ4939 Ynoi2016掉进兔子洞(莫队+bitset)

    容易发现要求三个区间各数出现次数的最小值.考虑bitset,不去重离散化后and一发就可以了.于是莫队求出每个区间的bitset.注意空间开不下,做多次即可.输出的东西错了都能调一年服了我了. #in ...