安卓键盘加上数字_Android自定义键盘的实现(数字键盘和字母键盘)
在项目中,产品对于输入方式会有特殊的要求,需要对输入方式增加特定的限制,这就需要采用自定义键盘。本文主要讲述数字键盘和字母键盘的自定义实现。
键盘效果:
自定义键盘的实现步骤如下:
自定义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自定义键盘的实现(数字键盘和字母键盘)相关推荐
- 获取控件enable状态_Android自定义组合控件数字加减(适用于购物车)
大家好,我是小黑,一个还没秃头的程序员~~~ 独学而无友,则孤陋而寡闻--<礼记·学记> 今天的内容是自定义一个数组加减的控件,可以应用于购物车的数量选择,效果如下: 自定义实现了控件的默 ...
- android 自定义键盘_Android自定义输入车牌号键盘、车牌简称,数字 ,字母键盘...
本文来自阿钟的投稿,全文阅读大约十分钟 为了便于用户快捷的输入车牌号码便需要自定义个车牌键盘,而不是使用系统的键盘输入,上效果图: 横屏效果 图片 竖屏效果 图片 一.首先我们要来分析一下需要做哪些东 ...
- 安卓键盘加上数字_HHKB Professional HYBRID静电容键盘图赏
前不久,HHKB推出了Professional HYBRID 双模版静电容键盘,在继承HHKB键盘经典按键布局和别致舒适的触感的基础上,额外支持无线蓝牙连接,可用于台式机.智能手机.平板电脑等多种设备 ...
- android自定义数字键盘和字母键盘,Android自定义键盘的实现(数字键盘和字母键盘)...
Android自定义键盘的实现(数字键盘和字母键盘) 发布时间:2020-09-04 03:18:48 来源:脚本之家 阅读:100 作者:浪淘沙xud 在项目中,产品对于输入方式会有特殊的要求,需要 ...
- android自定义金额输入键盘_Android 自定义输入支付密码的软键盘实例代码
Android 自定义输入支付密码的软键盘 有项目需求需要做一个密码锁功能,还有自己的软键盘,类似与支付宝那种,这里是整理的资料,大家可以看下,如有错误,欢迎留言指正 需求:要实现类似支付宝的输入支付 ...
- appium android数字字母切换键,Android自定义键盘:数字键盘和字母键盘
在项目中,产品对于输入方式会有特殊的要求,需要对输入方式增加特定的限制,这就需要采用自定义键盘.本文主要讲述数字键盘和字母键盘的自定义实现. 自定义键盘的实现步骤如下: 自定义CustomKeyboa ...
- android 自定义数字软键盘,Android自定义键盘的实现(数字键盘和字母键盘)
在项目中,产品对于输入方式会有特殊的要求,需要对输入方式增加特定的限制,这就需要采用自定义键盘.本文主要讲述数字键盘和字母键盘的自定义实现. 自定义键盘的实现步骤如下: 自定义CustomKeyboa ...
- android自定义金额输入键盘_Android自定义软键盘的实现
先看界面布局文件 android:layout_width="fill_parent" android:layout_height="fill_parent" ...
- 电脑键盘数字键失灵_C4D/3dmax/MaYa三维设计——高档机械键盘推荐·红轴(200元左右预算)...
如果你除了做C4D/3dmax/MaYa三维设计,还要兼顾PS/AI/CDR平面设计,或者涉及到很多文字排版的,有大量中有大量的文字输入的(一天码字量在两千以上), 那么,强烈建议使用红轴.青轴虽然机 ...
最新文章
- Vue入门一、常用的指令
- atlas和ajaxpro以及微软企业级类库在一起得web配置文件
- pytorch教程龙曲良16-20
- Ubuntu 16.04服务器安装及软件配置
- java表达式1 29的计算结果是,java表达式陷阱 - Funcy1122的个人空间 - OSCHINA - 中文开源技术交流社区...
- 聊聊jdk http的HeaderFilter
- 20200715:动态规划复习day06
- php里面什么是u函数,ThinkPHP内置函数----U方法
- sklearn笔记之preprocessing
- 安全技巧:映像劫持与反劫持技术
- MySQL笔记4——SQL去重/笛卡尔积现象
- php kindeditor远程图片上传,kindeditor 远程图片本地化,远程图片下载到本地自动更换图片路径...
- 手势识别(一)--手势基本概念和ChaLearn Gesture Challenge
- 如何永久关闭笔记本键盘
- java中宏定义,宏定义的使用
- 终于学完了阿里P8架构师7年心血整理总结的微服务实战文档
- 电机与matlab突然,电机与MATLAB(第2版)简介,目录书摘
- 无监督聚类算法该如何评价
- Java_面向对象基础(类、对象、方法和构造函数)
- 英特尔® 快速存储技术 RAID 功能;按芯片组/控制器集线器排列
热门文章
- 我回答的一个粉丝关于用编程语言模拟SAP事务的问题
- 从程序猿到SAP产品经理,我是如何转型的?
- 计算机组成原理中wr是什么,计算机组成原理复习例题.doc
- 指纹图谱相似度评价软件_基于指纹图谱和网络药理学对当归四逆汤中桂枝的Qmarker预测分析...
- 编写python程序、创建名为class的数据库_python面向对象编程class1
- 个人博客管理系统_教程 | 一文搭建你的第一个免费专属博客
- 电脑怎么python转行_零基础转行DA系列|一周Python for Data Science入门
- 浏览器打开php显示空白,pc微信浏览器打开页面显示空白,其他浏览器正常
- 大文件分片上传前端框架_基于Node.js的大文件分片上传
- TIMING_02 浅谈时序约束与时序分析