全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

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

键盘效果:

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

  1. 自定义CustomKeyboard, 继承自系统Keyboard,实现KeyboardView.OnKeyboardActionListener相关接口,以处理用户的点击回调;
  2. 自定义CustomKeyboardView, 继承自KeyboardView,实现自定义键盘绘制;
  3. 创建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

主要处理以下功能逻辑:

  1. 绑定EditText和Keyboard,监听EditText的OnFocusChangeListener,处理键盘弹出和键盘掩藏;
  2. 处理系统键盘和自定义键盘之间的切换关系;
  3. 处理键盘区域其他自定义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开发之如何自定义数字键盘详解  # Android自定义密码输入框和数字键盘  # Android 仿微信数字键盘  # 自定义  # 这就  # 绑定  # 都是  # 会有  # 还可以  # 可在  # 弹出  # 可以直接  # 要让  # 为例  # 所示  # 如需  # 并与  # 其主要  # 以对  # 回调  # 大家多多  # 搜索功能  # 方法如下 


相关文章: 广平建站公司哪家专业可靠?如何选择?  如何快速生成专业多端适配建站电话?  营销式网站制作方案,销售哪个网站招聘效果最好?  如何续费美橙建站之星域名及服务?  建站主机系统SEO优化与智能配置核心关键词操作指南  ,在苏州找工作,上哪个网站比较好?  宝塔建站无法访问?如何排查配置与端口问题?  实惠建站价格推荐:2025年高性价比自助建站套餐解析  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  如何在景安云服务器上绑定域名并配置虚拟主机?  如何彻底卸载建站之星软件?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  C#如何在一个XML文件中查找并替换文本内容  如何正确下载安装西数主机建站助手?  建站之星代理如何获取技术支持?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  制作宣传网站的软件,小红书可以宣传网站吗?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  ui设计制作网站有哪些,手机UI设计网址吗?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  官网网站制作腾讯审核要多久,联想路由器newifi官网  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  Thinkphp 中 distinct 的用法解析  建站之星图片链接生成指南:自助建站与智能设计教程  如何用AWS免费套餐快速搭建高效网站?  如何在橙子建站上传落地页?操作指南详解  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  如何在云主机上快速搭建网站?  如何用5美元大硬盘VPS安全高效搭建个人网站?  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  MySQL查询结果复制到新表的方法(更新、插入)  制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  如何配置WinSCP新建站点的密钥验证步骤?  如何选择美橙互联多站合一建站方案?  建站主机SSH密钥生成步骤及常见问题解答?  香港服务器WordPress建站指南:SEO优化与高效部署策略  电商网站制作公司有哪些,1688网是什么意思?  如何用PHP快速搭建高效网站?分步指南  ,怎么在广州志愿者网站注册?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  建站之星代理如何优化在线客服效率?  如何快速打造个性化非模板自助建站?  如何挑选优质建站一级代理提升网站排名?  个人网站制作流程图片大全,个人网站如何注销?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  潮流网站制作头像软件下载,适合母子的网名有哪些?  简单实现Android验证码  如何在云指建站中生成FTP站点? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。