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

项目地址:https://github.com/xudjx/djkeyboard
键盘效果:
自定义键盘的实现步骤如下:
自定义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的格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<Keyboard android:keyWidth="24.9%p"
android:keyHeight="49dp"
android:horizontalGap="0.1333%p"
android:verticalGap="1px"
xmlns:android="http://schemas.android.com/apk/res/android">
<Row>
<Key android:codes="49" android:keyEdgeFlags="left"
android:keyLabel="1" />
<Key android:codes="50" android:keyLabel="2" />
<Key android:codes="51" android:keyLabel="3" />
<Key android:codes="-5" android:iconPreview="@drawable/key_num_del_bg"
android:isRepeatable="true"/>
</Row>
...
</Keyboard>
详细的数字键盘和字母键盘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()中重新绘制。
详细代码可以参考github源码: BaseKeyBoardView源码
自定义键盘的UI效果如下:
数字键盘
字母键盘
创建KeyboardManager
主要处理以下功能逻辑:
以绑定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
# 自定义数字键盘
# 自定义字母键盘
# Android 仿微信自定义数字键盘的实现代码
# Android 高仿微信支付数字键盘功能
# Android 实现数字九宫格软键盘
# Android开发之如何自定义数字键盘详解
# Android自定义密码输入框和数字键盘
# Android 仿微信数字键盘
# 自定义
# 这就
# 绑定
# 都是
# 会有
# 还可以
# 可在
# 弹出
# 可以直接
# 要让
# 为例
# 所示
# 如需
# 并与
# 其主要
# 以对
# 回调
# 大家多多
# 搜索功能
# 方法如下
相关文章:
建站主机选购指南:核心配置优化与品牌推荐方案
如何通过商城自助建站源码实现零基础高效建站?
大连网站制作公司哪家好一点,大连买房网站哪个好?
如何在建站之星网店版论坛获取技术支持?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
网站网页制作专业公司,怎样制作自己的网页?
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
制作门户网站的参考文献在哪,小说网站怎么建立?
郑州企业网站制作公司,郑州招聘网站有哪些?
建站之星如何助力企业快速打造五合一网站?
制作网站外包平台,自动化接单网站有哪些?
建站之星如何取消后台验证码生成?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
建站主机选哪种环境更利于SEO优化?
如何通过西部数码建站助手快速创建专业网站?
网站建设设计制作营销公司南阳,如何策划设计和建设网站?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
建站主机选择指南:服务器配置与SEO优化实战技巧
香港服务器建站指南:免备案优势与SEO优化技巧全解析
MySQL查询结果复制到新表的方法(更新、插入)
如何安全更换建站之星模板并保留数据?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
如何正确选择百度移动适配建站域名?
北京网站制作网页,网站升级改版需要多久?
如何打造高效商业网站?建站目的决定转化率
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
如何基于云服务器快速搭建网站及云盘系统?
网站制作网站,深圳做网站哪家比较好?
建站之星会员如何解锁更多建站功能?
移民网站制作流程,怎么看加拿大移民官网?
整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?
三星网站视频制作教程下载,三星w23网页如何全屏?
如何在阿里云香港服务器快速搭建网站?
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
建站主机如何安装配置?新手必看操作指南
网站制作模板下载什么软件,ppt模板免费下载网站?
免费ppt制作网站,有没有值得推荐的免费PPT网站?
建站之星代理如何优化在线客服效率?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
宁波自助建站系统如何快速打造专业企业网站?
如何通过远程VPS快速搭建个人网站?
测试制作网站有哪些,测试性取向的权威测试或者网站?
存储型VPS适合搭建中小型网站吗?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
如何快速配置高效服务器建站软件?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
西安专业网站制作公司有哪些,陕西省建行官方网站?
网站制作需要会哪些技术,建立一个网站要花费多少?
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
*请认真填写需求信息,我们会在24小时内与您取得联系。