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

Android自定义键盘的实现(数字键盘和字母键盘),第1张

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

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

项目地址: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的格式如下:

<?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和Keyboard,监听EditText的OnFocuschangelistener,处理键盘d出和键盘掩藏; 处理系统键盘和自定义键盘之间的切换关系; 处理键盘区域其他自定义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自定义键盘的实现(数字键盘和字母键盘)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/web/1144950.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存