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

键盘效果:

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

自定义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自定义键盘的实现(数字键盘和字母键盘)相关推荐

  1. 获取控件enable状态_Android自定义组合控件数字加减(适用于购物车)

    大家好,我是小黑,一个还没秃头的程序员~~~ 独学而无友,则孤陋而寡闻--<礼记·学记> 今天的内容是自定义一个数组加减的控件,可以应用于购物车的数量选择,效果如下: 自定义实现了控件的默 ...

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

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

  3. 安卓键盘加上数字_HHKB Professional HYBRID静电容键盘图赏

    前不久,HHKB推出了Professional HYBRID 双模版静电容键盘,在继承HHKB键盘经典按键布局和别致舒适的触感的基础上,额外支持无线蓝牙连接,可用于台式机.智能手机.平板电脑等多种设备 ...

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

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

  5. android自定义金额输入键盘_Android 自定义输入支付密码的软键盘实例代码

    Android 自定义输入支付密码的软键盘 有项目需求需要做一个密码锁功能,还有自己的软键盘,类似与支付宝那种,这里是整理的资料,大家可以看下,如有错误,欢迎留言指正 需求:要实现类似支付宝的输入支付 ...

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

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

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

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

  8. android自定义金额输入键盘_Android自定义软键盘的实现

    先看界面布局文件 android:layout_width="fill_parent" android:layout_height="fill_parent" ...

  9. 电脑键盘数字键失灵_C4D/3dmax/MaYa三维设计——高档机械键盘推荐·红轴(200元左右预算)...

    如果你除了做C4D/3dmax/MaYa三维设计,还要兼顾PS/AI/CDR平面设计,或者涉及到很多文字排版的,有大量中有大量的文字输入的(一天码字量在两千以上), 那么,强烈建议使用红轴.青轴虽然机 ...

最新文章

  1. Vue入门一、常用的指令
  2. atlas和ajaxpro以及微软企业级类库在一起得web配置文件
  3. pytorch教程龙曲良16-20
  4. Ubuntu 16.04服务器安装及软件配置
  5. java表达式1 29的计算结果是,java表达式陷阱 - Funcy1122的个人空间 - OSCHINA - 中文开源技术交流社区...
  6. 聊聊jdk http的HeaderFilter
  7. 20200715:动态规划复习day06
  8. php里面什么是u函数,ThinkPHP内置函数----U方法
  9. sklearn笔记之preprocessing
  10. 安全技巧:映像劫持与反劫持技术
  11. MySQL笔记4——SQL去重/笛卡尔积现象
  12. php kindeditor远程图片上传,kindeditor 远程图片本地化,远程图片下载到本地自动更换图片路径...
  13. 手势识别(一)--手势基本概念和ChaLearn Gesture Challenge
  14. 如何永久关闭笔记本键盘
  15. java中宏定义,宏定义的使用
  16. 终于学完了阿里P8架构师7年心血整理总结的微服务实战文档
  17. 电机与matlab突然,电机与MATLAB(第2版)简介,目录书摘
  18. 无监督聚类算法该如何评价
  19. Java_面向对象基础(类、对象、方法和构造函数)
  20. 英特尔® 快速存储技术 RAID 功能;按芯片组/控制器集线器排列

热门文章

  1. 我回答的一个粉丝关于用编程语言模拟SAP事务的问题
  2. 从程序猿到SAP产品经理,我是如何转型的?
  3. 计算机组成原理中wr是什么,计算机组成原理复习例题.doc
  4. 指纹图谱相似度评价软件_基于指纹图谱和网络药理学对当归四逆汤中桂枝的Qmarker预测分析...
  5. 编写python程序、创建名为class的数据库_python面向对象编程class1
  6. 个人博客管理系统_教程 | 一文搭建你的第一个免费专属博客
  7. 电脑怎么python转行_零基础转行DA系列|一周Python for Data Science入门
  8. 浏览器打开php显示空白,pc微信浏览器打开页面显示空白,其他浏览器正常
  9. 大文件分片上传前端框架_基于Node.js的大文件分片上传
  10. TIMING_02 浅谈时序约束与时序分析