android 调取数字键盘,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 调取数字键盘,Android自定义键盘的实现(数字键盘和字母键盘)相关推荐
- android 自定义键盘_Android自定义输入车牌号键盘、车牌简称,数字 ,字母键盘...
本文来自阿钟的投稿,全文阅读大约十分钟 为了便于用户快捷的输入车牌号码便需要自定义个车牌键盘,而不是使用系统的键盘输入,上效果图: 横屏效果 图片 竖屏效果 图片 一.首先我们要来分析一下需要做哪些东 ...
- android 自定义安全键盘,android 实现自定义安全键盘 且每次数字随机变换位置
但是没有实现随机键盘 本次以该demo中的数字键盘为例 如何在每次打开键盘的时候都变换对应按键的位置 在设置自定义键盘keyboardView.setKeyboard(keyboard) 之前 随机排 ...
- android自定义数字键盘和字母键盘,Android自定义键盘的实现(数字键盘和字母键盘)...
Android自定义键盘的实现(数字键盘和字母键盘) 发布时间:2020-09-04 03:18:48 来源:脚本之家 阅读:100 作者:浪淘沙xud 在项目中,产品对于输入方式会有特殊的要求,需要 ...
- appium android数字字母切换键,Android自定义键盘:数字键盘和字母键盘
在项目中,产品对于输入方式会有特殊的要求,需要对输入方式增加特定的限制,这就需要采用自定义键盘.本文主要讲述数字键盘和字母键盘的自定义实现. 自定义键盘的实现步骤如下: 自定义CustomKeyboa ...
- android 自定义数字软键盘,Android自定义键盘的实现(数字键盘和字母键盘)
在项目中,产品对于输入方式会有特殊的要求,需要对输入方式增加特定的限制,这就需要采用自定义键盘.本文主要讲述数字键盘和字母键盘的自定义实现. 自定义键盘的实现步骤如下: 自定义CustomKeyboa ...
- android开发自定义键盘,Android 总结:自定义键盘实现原理和三种实例详解
1.实现原理 实现软键盘主要用到了系统的两个类 Keyboard 和 KeyboardView .html 1. Keyboard 用于监听虚拟键盘:java Loads an XML descrip ...
- Android密码字符为真,Android仿支付宝密码输入框与数字键盘
1.概述 Android自定义密码输入框,通过自定义输入6位显示框和自定义9宫格数字键盘,实现仿支付宝数字键盘输入功能等.代码已托管到github,有需要的话可以去我的github下载.大家也可以自定 ...
- android自动软键盘,Android自定义软键盘
MyKeyboard Android自定义键盘的使用 实现步骤 第一步: 1.新建一个xml文件夹放在res目录下面,然后新建xml文件:money_keyboard.xml 2.然后在XML文件中添 ...
- Android UI设计之十一自定义ViewGroup,打造通用的关闭键盘小控件ImeObser
2019独角兽企业重金招聘Python工程师标准>>> 转载请注明出处:http://blog.csdn.net/llew2011/article/details/51598682 ...
- android 键盘 定义,自定义全键盘-[Android_YangKe]
尊重劳动者创作,转发请注明出处 首先看本文实现的效果. yangke.gif 学而不思则罔,思而不学则殆.一眨眼五一小长假就结束了,完全没玩嗨呢,不能完全进入工作状态,小伙伴们扶我起来嗨.一年嗨两次, ...
最新文章
- stackover flow载入巨慢
- jQuery 入门教程(1): 概述
- Ansj中文分词Java开发自定义和过滤词库
- LInux之建立文件和目录
- Nginx-常见服务器的对比
- 典型电商网站的站点导航的布局结构实现,及运用三种方式实现下拉效果
- Codeforces 55D Beautiful numbers (数位DP)
- (转)Hibernate的一级缓存
- 如何精通java_如何精通java技术
- Linux 相关术语_002
- Ubuntu中打开.ipynb文件
- 感谢贫穷,是贫穷限制了人们的善良
- yarn在vscode里启动报错
- 刷题总结——Human Gene Functions(hdu1080)
- 上次被人说TK不好咯,这次给你整个高大上的
- Layout 和 Menu【转】
- Linux下安装PHP扩展
- docker java 中文乱码_记一次ubuntu docker 镜像 java 中文乱码问题查找
- 【Luat-air105】8.1 camera拍照
- JSP九大内置对象总结
热门文章
- 1449 后缀表达式
- java-net-php-python-springboot办公自动化系统计算机毕业设计程序
- 开发服务器 k8s 设置 自定义 dns解析
- BZOJ P1189[HNOI2007]紧急疏散evacuate
- Win10系统如何在右键菜单添加管理员取得所有权
- Progressive LayeredExtraction(PLE):ANovelMulti-Task Learning(MTL)ModelforPersonalizedRecommendations
- 按键拨号声音 DTMF MATLAB程序样例
- EMV(一):初步了解EMV和EMV的分层结构
- 笔记本插入耳机没反应 必须重启前插入再启动才行 启动后拔下再插入依旧外放
- 从bilibili下载视频,取其音频