Android自定义输入法软键盘

本文实例为大家分享了Android自定义输入法软键盘的具体代码,供大家参考,具体内容如下

1 功能描述

  • 触屏设备主界面中有一个文本编辑框,底部区域固定显示一个数字键盘,键盘中除数字键外,还带有*和#键功能;
  • 提供一个自定义的数字输入法,生成apk安装包文件,嵌入到img镜像文件中去。

2 设计实现

1、创建类名为SimpleIME,继承父类InputMethodService,实现KeyboardView.OnKeyboardActionListener接口。
2、编写键盘对象加载的.xml文件。
3、重写onCreateInputView()方法,初始化键盘视图和创建键盘对象,使用键盘视图对象设置键盘的监听。
4、重写onKey、onPress、onRelease、onText、swipeDown、swipeLeft、swipeRight和swipeUp等方法,在onKey方法中可处理对键盘的操作,在这个方法里通过传入的primaryCode进行相应的操作。其他方法没有具体的实现。
5、配置清单文件的声明service,还向系统申请了IME的BIND_INPUT_METHOD权限,并且给IME添加了一个名称为android.view.InputMethod的过滤器,用来存放意图的属性。

3 贴出代码

1、SimpleIME.java

import android.inputmethodservice.InputMethodService;
import android.inputmethodservice.Keyboard;
import android.inputmethodservice.KeyboardView;
import android.media.AudioManager;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.InputConnection;

/**
 * @description: 自定义输入法
 * @version: v1.0
 * @author: yeyl
 * @date: 2018/6/26 14:57
 * @history:
 */
public class SimpleIME extends InputMethodService
 implements KeyboardView.OnKeyboardActionListener {

 private KeyboardView mKeyboardView;
 private Keyboard mKeyboard;
 /**
 * 大小写转换的flag
 */
 private boolean mCaps = false;

 @Override
 public View onCreateInputView() {
 mKeyboardView = (KeyboardView) getLayoutInflater().inflate(R.layout.layout_keyboard, null);
 mKeyboard = new Keyboard(this, R.xml.keyboard_number);
 mKeyboardView.setKeyboard(mKeyboard);
 mKeyboardView.setOnKeyboardActionListener(this);
 return mKeyboardView;
 }

 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {
 return super.onKeyDown(keyCode, event);
 }

 @Override
 public void onKey(int primaryCode, int[] keyCodes) {
 InputConnection ic = getCurrentInputConnection();
 playClick(primaryCode);
 switch (primaryCode) {
  case Keyboard.KEYCODE_DELETE:
  // 回退
  ic.deleteSurroundingText(1, 0);
  break;
  case Keyboard.KEYCODE_SHIFT:
  // 大小写切换
  mCaps = !mCaps;
  mKeyboard.setShifted(mCaps);
  mKeyboardView.invalidateAllKeys();
  break;
  case Keyboard.KEYCODE_DONE:
  // 完成
  ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_ENTER));
  break;
  case Keyboard.KEYCODE_CANCEL:
  // 取消
  ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));
  ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK));
  break;
  default:
  char code = (char) primaryCode;
  if (Character.isLetter(code) && mCaps) {
   code = Character.toUpperCase(code);
  }
  ic.commitText(String.valueOf(code), 1);
 }
 }

 /**
 * 播放按键音
 *
 * @param keyCode 键码
 */
 private void playClick(int keyCode) {
 AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);
 switch (keyCode) {
  case 32:
  am.playSoundEffect(AudioManager.FX_KEYPRESS_SPACEBAR);
  break;
  case Keyboard.KEYCODE_DONE:
  case 10:
  am.playSoundEffect(AudioManager.FX_KEYPRESS_RETURN);
  break;
  case Keyboard.KEYCODE_DELETE:
  am.playSoundEffect(AudioManager.FX_KEYPRESS_DELETE);
  break;
  default:
  am.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD);
 }
 }

 @Override
 public void onPress(int primaryCode) {
 }

 @Override
 public void onRelease(int primaryCode) {
 }

 @Override
 public void onText(CharSequence text) {
 }

 @Override
 public void swipeDown() {
 }

 @Override
 public void swipeLeft() {
 }

 @Override
 public void swipeRight() {
 }

 @Override
 public void swipeUp() {
 }
}

2、layout_keyboard.xml

<?xml version="1.0" encoding="UTF-8"?>
<android.inputmethodservice.KeyboardView xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/keyboard"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_alignParentBottom="true"
 android:keyPreviewLayout="@layout/layout_preview" />

3、layout_preview.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="#FFFF00"
 android:gravity="center"
 android:textSize="30sp"
 android:textStyle="bold" />

4、keyboard_number.xml

<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
 android:horizontalGap="0px"
 android:keyWidth="33.3%p"
 android:keyHeight="9%p"
 android:verticalGap="0px">
 <Row>
 <Key
  android:codes="49"
  android:keyEdgeFlags="left"
  android:keyLabel="1" />
 <Key
  android:codes="50"
  android:keyLabel="2" />
 <Key
  android:codes="51"
  android:keyEdgeFlags="right"
  android:keyLabel="3" />
 </Row>
 <Row>
 <Key
  android:codes="52"
  android:keyEdgeFlags="left"
  android:keyLabel="4" />
 <Key
  android:codes="53"
  android:keyLabel="5" />
 <Key
  android:codes="54"
  android:keyEdgeFlags="right"
  android:keyLabel="6" />
 </Row>
 <Row>
 <Key
  android:codes="55"
  android:keyEdgeFlags="left"
  android:keyLabel="7" />
 <Key
  android:codes="56"
  android:keyLabel="8" />
 <Key
  android:codes="57"
  android:keyEdgeFlags="right"
  android:keyLabel="9" />
 </Row>
 <Row android:rowEdgeFlags="bottom">
 <Key
  android:codes="-3"
  android:keyEdgeFlags="left"
  android:keyLabel="*" />
 <Key
  android:codes="48"
  android:keyLabel="0" />
 <Key
  android:codes="-4"
  android:isRepeatable="true"
  android:keyEdgeFlags="right"
  android:keyLabel="完成" />
 </Row>
</Keyboard>

5、AndroidManifest.xml

<service
  android:name=".SimpleIME"
  android:label="@string/simple_ime"
  android:permission="android.permission.BIND_INPUT_METHOD">
  <meta-data
  android:name="android.view.im"
  android:resource="@xml/method" />
  <intent-filter>
  <action android:name="android.view.InputMethod" />
  </intent-filter>
</service>

6、method.xml

<?xml version="1.0" encoding="utf-8"?>
<input-method xmlns:android="http://schemas.android.com/apk/res/android">
 <subtype
 android:imeSubtypeLocale="en_US"
 android:imeSubtypeMode="keyboard"
 android:label="@string/subtype_en_US" />
</input-method>

4 Demo截图

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android 软键盘状态并隐藏输入法的实例

    Android 软键盘状态并隐藏输入法的实例 1 软键盘状态的切换 2 强制隐藏输入法键盘 MainActivity如下: package cc.c; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.inputmethod.InputMethodManager; import android.widget.Button

  • Android 点击屏幕空白处收起输入法软键盘(手动打开)

    很多时候,我们在使用应用时,会出现输入法软键盘弹出的问题,通常情况下,我们默认会使用户点击返回键或者下一步对软键盘进行隐藏.为了更好的体验,我们可以实现当用户使用完毕软键盘时.点击屏幕空白区域即可实现收起输入法软键盘功能.下面给大家介绍下实现方法. 1.//隐藏软键盘   在Java文件: InputMethodManager m = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE); m .

  • Android自定义输入法软键盘

    本文实例为大家分享了Android自定义输入法软键盘的具体代码,供大家参考,具体内容如下 1 功能描述 触屏设备主界面中有一个文本编辑框,底部区域固定显示一个数字键盘,键盘中除数字键外,还带有*和#键功能: 提供一个自定义的数字输入法,生成apk安装包文件,嵌入到img镜像文件中去. 2 设计实现 1.创建类名为SimpleIME,继承父类InputMethodService,实现KeyboardView.OnKeyboardActionListener接口. 2.编写键盘对象加载的.xml文件

  • Android自定义View软键盘实现搜索

    1. xml文件中加入自定义 搜索view <com.etoury.etoury.ui.view.IconCenterEditText android:id="@+id/search_et" style="@style/StyleEditText" android:hint="搜索景点信息" /> 2. 自定义的   view java文件 IconCenterEditText.java package com.etoury.etou

  • Android编程之软键盘的隐藏显示实例详解

    本文实例分析了Android编程之软键盘的隐藏显示方法.分享给大家供大家参考,具体如下: Android是一个针对触摸屏专门设计的操作系统,当点击编辑框,系统自动为用户弹出软键盘,以便用户进行输入. 那么,弹出软键盘后必然会造成原有布局高度的减少,那么系统应该如何来处理布局的减少?我们能否在应用程序中进行自定义的控制?这些是本文要讨论的重点. 一.软键盘显示的原理 软件盘的本质是什么?软键盘其实是一个Dialog! InputMethodService为我们的输入法创建了一个Dialog,并且将

  • Android开发中软键盘的显示和隐藏

    本篇内容通过操作软键盘的函数着手详细分析了隐藏或者显示软键盘的实现方法,并且对其中重要的代码做了详细分析. 一.开篇 如果有需要用到输入的地方,通常会有需要自动弹出或者收起软键盘的需求.开篇明义,本文会讲讲弹出和收起软键盘的一些细节,最终还会从源码进行分析. 想要操作软键盘,需要使用到 InputMethodManager ,它是一个系统服务,可以使用 Context.getSystemService() 获取到它.而很多关键的逻辑代码,都是在 InputMethodManagerService

  • Android 监听软键盘状态的实例详解

    Android 监听软键盘状态的实例详解 近日遇到要检测软键盘是否显示或隐藏的问题,搜了一下网上,最后找到一个很简单的,记录一下. activityRoot是activity的根view,就是xml里面的第一个view,给它设置一个id. final View activityRootView = findViewById(R.id.activityRoot); activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(ne

  • Android屏蔽EditText软键盘的方法

    本文实例讲述了Android屏蔽EditText软键盘的方法.分享给大家供大家参考.具体如下: java代码如下: InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(myEdit.getWindowToken(), 0); //myEdit是你的EditText对象 可以通过下面方法恢复显示: boolea

  • Android 弹出软键盘所遇到的坑及解决方法

    demo下载 重要代码: //1.此layout作为最外层的layout: //2.设置需要调整的view: setAdjustView(View view); //3.如果需要控制输入框的显示与隐藏,可以实现OnInputViewVisibleListener接口: public class SoftInputAdjustLayout extends RelativeLayout { private static final String TAG = SoftInputAdjustLayout

  • Android EditText被软键盘遮盖的处理方法

    这两天android app新增了透明栏效果,结果发现键盘弹起后会遮盖屏幕底部的EditText,没有像想象中的调整窗口大小,并滚动ScrollView,将EditText显示在键盘上方.之前也遇到过类似问题,所以解决后就干脆写把所有关于EditText和键盘之间问题和解决思路都记录一下,以便以后查阅. 一.在5.0以前,如果EditText设置了gravity="center|right"其中之一且同时设置了singleLine="true",就会导致屏幕底部的E

  • Android开发之软键盘用法实例分析

    本文实例讲述了Android开发中软键盘用法.分享给大家供大家参考.具体如下: 打开软键盘,有两个方法.一个是showSoftInput,一个是toggleSoftInput. package com.example.dd; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.Menu; import android.view.View

随机推荐