在项目中,产品对于输入方式会有特殊的要求,需要对输入方式增加特定的限制,这就需要采用自定义键盘。本文主要讲述数字键盘和字母键盘的自定义实现。

键盘效果:

自定义键盘的实现步骤如下:

自定义CustomKeyboard, 继承自系统Keyboard,实现KeyboardView.OnKeyboardActionListener相关接口,以处理用户的点击回调;

自定义CustomKeyboardView, 继承自KeyboardView,实现自定义键盘绘制;

创建KeyboardManager, 用于处理自定义键盘的显示以及和输入UI的交互

自定义CustomKeyboard

Android系统Keyboard的构造方法如下:

/**

* Creates a keyboard from the given xml key layout file.

* @param context the application or service context

* @param xmlLayoutResId the resource file that contains the keyboard layout and keys.

*/

public Keyboard(Context context, int xmlLayoutResId) {

this(context, xmlLayoutResId, 0);

}

/**

* Creates a keyboard from the given xml key layout file. Weeds out rows

* that have a keyboard mode defined but don't match the specified mode.

* @param context the application or service context

* @param xmlLayoutResId the resource file that contains the keyboard layout and keys.

* @param modeId keyboard mode identifier

* @param width sets width of keyboard

* @param height sets height of keyboard

*/

public Keyboard(Context context, @XmlRes int xmlLayoutResId, int modeId, int width,

int height) {

...

}

其中,参数xmlLayoutResId是必须的,另外还可以通过计算系统键盘的高度来设定自定义键盘的高度。

xmlLayoutRes的格式如下:

android:keyHeight="49dp"

android:horizontalGap="0.1333%p"

android:verticalGap="1px"

xmlns:android="http://schemas.android.com/apk/res/android">

android:keyLabel="1" />

android:isRepeatable="true"/>

...

详细的数字键盘和字母键盘xmlLayoutRes资源文件可以从以下链接获取:

数字键盘xmlLayoutRes

字母键盘xmlLayoutRes

CustomKeyboard主要目的就是赋予xmlLayoutRes并实现特定按键的点击处理,其主要重载的方法是onKey(int primaryCode, int[] keyCodes)。详细代码如下:

public abstract class BaseKeyboard extends Keyboard implements KeyboardView.OnKeyboardActionListener{

@Override

public void onKey(int primaryCode, int[] keyCodes) {

if(null != mEditText && mEditText.hasFocus() && !handleSpecialKey(primaryCode)) {

Editable editable = mEditText.getText();

int start = mEditText.getSelectionStart();

int end = mEditText.getSelectionEnd();

if (end > start){

editable.delete(start,end);

}

if(primaryCode == KEYCODE_DELETE) {

if(!TextUtils.isEmpty(editable)) {

if(start > 0) {

editable.delete(start-1,start);

}

}

}else if(primaryCode == getKeyCode(R.integer.hide_keyboard)){

hideKeyboard();

}else {

editable.insert(start,Character.toString((char) primaryCode));

}

}

}

public abstract boolean handleSpecialKey(int primaryCode);

}

如上所示是BaseKeyboard,数字键盘和字母键盘需要继承它,并实现public abstract boolean handleSpecialKey(int primaryCode)方法。

自定义CustomKeyboardView

KeyboardView 是承载不同的keyboard并绘制keyboard, 是键盘布局的绘制板, 并与系统交互。通过继承KeyboardView自定义CustomKeyboardView,可以对按键样式实现自定义。考察KeyboardView的源码,发现其UI样式都是private类型,这就需要通过反射的方式获取特定的UI属性,并重新进行赋值,同时重载onDraw()方法,在onDraw()中重新绘制。

自定义键盘的UI效果如下:

数字键盘

字母键盘

创建KeyboardManager

主要处理以下功能逻辑:

绑定EditText和Keyboard,监听EditText的OnFocusChangeListener,处理键盘弹出和键盘掩藏;

处理系统键盘和自定义键盘之间的切换关系;

处理键盘区域其他自定义view的显示,比如需要让键盘自动搜索功能时,可在manager中进行相关处理

以绑定EditText为例:

public void bindToEditor(EditText editText, BaseKeyboard keyboard) {

hideSystemSoftKeyboard(editText);

editText.setTag(R.id.bind_keyboard_2_editor, keyboard);

if (keyboard.getKeyStyle() == null) {

keyboard.setKeyStyle(mDefaultKeyStyle);

}

editText.setOnFocusChangeListener(editorFocusChangeListener);

}

private final View.OnFocusChangeListener editorFocusChangeListener = new View.OnFocusChangeListener() {

@Override

public void onFocusChange(final View v, boolean hasFocus) {

if (v instanceof EditText) {

if (hasFocus) {

v.postDelayed(new Runnable() {

@Override

public void run() {

showSoftKeyboard((EditText) v);

}

},300);

} else {

hideSoftKeyboard();

}

}

}

};

public void showSoftKeyboard(EditText editText) {

mRootView.addOnLayoutChangeListener(mOnLayoutChangeListener);

BaseKeyboard keyboard = getBindKeyboard(editText);

if (keyboard == null) {

Log.e(TAG, "edit text not bind to keyboard");

return;

}

keyboard.setEditText(editText);

keyboard.setNextFocusView(mKeyboardWithSearchView.getEditText());

initKeyboard(keyboard);

...

}

键盘的使用方式非常简单, 通过KeyboardManager实现调用

数字键盘:

KeyboardManager keyboardManagerNumber = new KeyboardManager(this);

keyboardManagerNumber.bindToEditor(editText2, new NumberKeyboard(context,NumberKeyboard.DEFAULT_NUMBER_XML_LAYOUT));

字母键盘:

KeyboardManager keyboardManagerAbc = new KeyboardManager(this);

keyboardManagerAbc.bindToEditor(editText1, new ABCKeyboard(context, ABCKeyboard.DEFAULT_ABC_XML_LAYOUT));

至此,自定义键盘的实现就介绍完了,文中介绍的更多还是实现的思路,具体实现可以参考github,有需要的用户也可以直接修改项目的源码。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android 调取数字键盘,Android自定义键盘的实现(数字键盘和字母键盘)相关推荐

  1. android 自定义键盘_Android自定义输入车牌号键盘、车牌简称,数字 ,字母键盘...

    本文来自阿钟的投稿,全文阅读大约十分钟 为了便于用户快捷的输入车牌号码便需要自定义个车牌键盘,而不是使用系统的键盘输入,上效果图: 横屏效果 图片 竖屏效果 图片 一.首先我们要来分析一下需要做哪些东 ...

  2. android 自定义安全键盘,android 实现自定义安全键盘 且每次数字随机变换位置

    但是没有实现随机键盘 本次以该demo中的数字键盘为例 如何在每次打开键盘的时候都变换对应按键的位置 在设置自定义键盘keyboardView.setKeyboard(keyboard) 之前 随机排 ...

  3. android自定义数字键盘和字母键盘,Android自定义键盘的实现(数字键盘和字母键盘)...

    Android自定义键盘的实现(数字键盘和字母键盘) 发布时间:2020-09-04 03:18:48 来源:脚本之家 阅读:100 作者:浪淘沙xud 在项目中,产品对于输入方式会有特殊的要求,需要 ...

  4. appium android数字字母切换键,Android自定义键盘:数字键盘和字母键盘

    在项目中,产品对于输入方式会有特殊的要求,需要对输入方式增加特定的限制,这就需要采用自定义键盘.本文主要讲述数字键盘和字母键盘的自定义实现. 自定义键盘的实现步骤如下: 自定义CustomKeyboa ...

  5. android 自定义数字软键盘,Android自定义键盘的实现(数字键盘和字母键盘)

    在项目中,产品对于输入方式会有特殊的要求,需要对输入方式增加特定的限制,这就需要采用自定义键盘.本文主要讲述数字键盘和字母键盘的自定义实现. 自定义键盘的实现步骤如下: 自定义CustomKeyboa ...

  6. android开发自定义键盘,Android 总结:自定义键盘实现原理和三种实例详解

    1.实现原理 实现软键盘主要用到了系统的两个类 Keyboard 和 KeyboardView .html 1. Keyboard 用于监听虚拟键盘:java Loads an XML descrip ...

  7. Android密码字符为真,Android仿支付宝密码输入框与数字键盘

    1.概述 Android自定义密码输入框,通过自定义输入6位显示框和自定义9宫格数字键盘,实现仿支付宝数字键盘输入功能等.代码已托管到github,有需要的话可以去我的github下载.大家也可以自定 ...

  8. android自动软键盘,Android自定义软键盘

    MyKeyboard Android自定义键盘的使用 实现步骤 第一步: 1.新建一个xml文件夹放在res目录下面,然后新建xml文件:money_keyboard.xml 2.然后在XML文件中添 ...

  9. Android UI设计之十一自定义ViewGroup,打造通用的关闭键盘小控件ImeObser

    2019独角兽企业重金招聘Python工程师标准>>> 转载请注明出处:http://blog.csdn.net/llew2011/article/details/51598682 ...

  10. android 键盘 定义,自定义全键盘-[Android_YangKe]

    尊重劳动者创作,转发请注明出处 首先看本文实现的效果. yangke.gif 学而不思则罔,思而不学则殆.一眨眼五一小长假就结束了,完全没玩嗨呢,不能完全进入工作状态,小伙伴们扶我起来嗨.一年嗨两次, ...

最新文章

  1. stackover flow载入巨慢
  2. jQuery 入门教程(1): 概述
  3. Ansj中文分词Java开发自定义和过滤词库
  4. LInux之建立文件和目录
  5. Nginx-常见服务器的对比
  6. 典型电商网站的站点导航的布局结构实现,及运用三种方式实现下拉效果
  7. Codeforces 55D Beautiful numbers (数位DP)
  8. (转)Hibernate的一级缓存
  9. 如何精通java_如何精通java技术
  10. Linux 相关术语_002
  11. Ubuntu中打开.ipynb文件
  12. 感谢贫穷,是贫穷限制了人们的善良
  13. yarn在vscode里启动报错
  14. 刷题总结——Human Gene Functions(hdu1080)
  15. 上次被人说TK不好咯,这次给你整个高大上的
  16. Layout 和 Menu【转】
  17. Linux下安装PHP扩展
  18. docker java 中文乱码_记一次ubuntu docker 镜像 java 中文乱码问题查找
  19. 【Luat-air105】8.1 camera拍照
  20. JSP九大内置对象总结

热门文章

  1. 1449 后缀表达式
  2. java-net-php-python-springboot办公自动化系统计算机毕业设计程序
  3. 开发服务器 k8s 设置 自定义 dns解析
  4. BZOJ P1189[HNOI2007]紧急疏散evacuate
  5. Win10系统如何在右键菜单添加管理员取得所有权
  6. Progressive LayeredExtraction(PLE):ANovelMulti-Task Learning(MTL)ModelforPersonalizedRecommendations
  7. 按键拨号声音 DTMF MATLAB程序样例
  8. EMV(一):初步了解EMV和EMV的分层结构
  9. 笔记本插入耳机没反应 必须重启前插入再启动才行 启动后拔下再插入依旧外放
  10. 从bilibili下载视频,取其音频