Android自定义键盘的实现(数字键盘和字母键盘)

发布时间:2020-09-04 03:18:48

来源:脚本之家

阅读:100

作者:浪淘沙xud

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

项目地址:https://github.com/xudjx/djkeyboard

键盘效果:

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

自定义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()中重新绘制。

详细代码可以参考github源码: BaseKeyBoardView源码

自定义键盘的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)

    微信调用支付数字键盘功能实现方法(Android)现在微信支付.输入密码功能,已经开始使用自定义数字键盘,这样不仅更加方便.其效果着实精致.你知道微信支付和输入密码时自定义数字键盘是如何实现的? 不知 ...

  2. android 中自定义键盘,【图片】自定义属于自己的专属键盘的思路!!!(需要有android编程基础)【exagear吧】_百度贴吧...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 最近玩一些全键盘游戏,比如elona,nethack等等这类游戏,模拟器的键盘就很不够用,那个 游戏键盘 软件用起来体验也很不好,今天自己就琢磨着为这些游 ...

  3. android 键盘 输入图片,【图片】自定义属于自己的专属键盘的思路!!!(需要有android编程基础)【exagear吧】_百度贴吧...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 最近玩一些全键盘游戏,比如elona,nethack等等这类游戏,模拟器的键盘就很不够用,那个 游戏键盘 软件用起来体验也很不好,今天自己就琢磨着为这些游 ...

  4. android 修改系统键盘布局,【图片】自定义属于自己的专属键盘的思路!!!(需要有android编程基础)【exagear吧】_百度贴吧...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 最近玩一些全键盘游戏,比如elona,nethack等等这类游戏,模拟器的键盘就很不够用,那个 游戏键盘 软件用起来体验也很不好,今天自己就琢磨着为这些游 ...

  5. android 系统 keyboard 第一个字母是大写,「这个控件叫什么」系列之虚拟键盘/软键盘/Soft Keyboard...

    @龙爪槐守望者 :鉴于国内交互设计名词混乱不统一,很多设计师不知道如何用专业术语称呼一个控件,因此我开了<这个控件叫什么>专题,梳理控件的名称和使用事项,希望能为推动交互设计发展,做出一点 ...

  6. android软键盘自动弹出,Android屏蔽软键盘自动弹出的解决方案

    问题概述 在编辑框输入内容时会弹出软键盘,而手机屏幕区域有限往往会遮住输入界面,我们先看一下问题效果图: 输入用户名和密码时,系统会弹出键盘,造成系统键盘会挡住文本框的问题,如图所示: 输入密码时输入 ...

  7. android 设置键盘弹出动画,Android实现键盘弹出界面上移的实现思路

    1.首先说一下思路: 基本就是结合layout中ScrollView视图和AndroidManifest.xml中activity中的android:windowSoftInputMode属性配置实现 ...

  8. h5 android 按钮键盘,【前端】Android 键盘顶起H5元素的问题

    我写文章的目的主要是做个记录和锻炼自己的写作能力,而且我入门前端时间比较短,如果有什么问题,欢迎指教! 最近开发H5应用,遇到了Android键盘把固定元素顶起的问题.我的页面底部固定了几个元素,使用 ...

  9. android华为手机虚拟键盘盖住底部,Android 虚拟键盘遮挡住页面问题我遇到的坑及个人解决办法...

    场景:某个页面多个组件.总体排版正好凑成满屏.一切按照UI给的标注效果图来.大部分机型测试通过.没有问题.华为手机有问题 兼容性:华为手机修改了虚拟键盘的位置.用户可以自由控制显示与隐藏虚拟键盘出现在 ...

  10. 对EditText的软键盘进行监听-----android:imeOptions

    在android发开过程中,有时候需要对EditText的软键盘进行监听. 当点击软键盘回车位置按键的时候,需要实现 完成.前进.下一项.搜索.发送或其他功能,这就需要开发者对软键盘回车的点击事件进行 ...

最新文章

  1. ubuntu 10.10 配置 tomcat6
  2. C#网络编程(基本概念和操作) - Part.1
  3. 关于stm32F4CAN总线调试
  4. 微服务治理实践:服务契约
  5. html5外置样式表,HTML5移动端通用css详解
  6. uni-app和php交互DES加密解密数据
  7. TCP如何实现可靠性传输
  8. 「leetcode」98. 验证二叉搜索树:中序遍历【递归】【迭代】详解
  9. 手把手教你如何对接支付宝支付接口(奶爸级别)
  10. apr内存池简单应用
  11. python刷题记录:买帽子
  12. 执念斩长河暑期出发录
  13. 【积水成渊-逐步定制自己的Emacs神器】2:基本的定制Emacs
  14. 中文字典排序与多音字处理
  15. 开发常用的Git命令
  16. php 抽象工厂模式,PHP设计模式(三)抽象工厂模式(Abstract Factory)
  17. iOS抖音 内部方法 名称
  18. 实训一 思科交换机基础配置
  19. python学生档案管理系统_【校园杂工】Python脚本处理档案图片之1
  20. Unity3D 5 官方教程:标准着色器:内容和环境;金属与镜面工作流

热门文章

  1. 泛型DAO与泛型Service
  2. 字符串和数字之间的转化
  3. Teamprise Readies Java SDK for TFS
  4. 随堂小测app冲刺(三)
  5. 【BZOJ4269】再见Xor 高斯消元
  6. jQueryh插件imgareaselect
  7. 企业级控件库之大数据量分页控件 (非原创)
  8. JS 关于(function( window, undefined ) {})(window)写法的理解
  9. mysql LOCK TABLES
  10. 对jquery的conflict方法的解读