参考文档:http://developer.android.com/guide/topics/text/creating-input-method.html


实现输入法的步骤:

输入法程序的核心是一个服务类,这个类必须继承自InputMethodService。

下面先来看看实现一个基本的输入法程序的步骤。

(1)建立一个继承自android.inputmethodservice.InputMethodService的类,称为输入法的服务类。

(2)在AndroidManifest.xml文件中配置这个服务类。

(3)编写一个用于显示软键盘的布局文件。

(4)覆盖InputMethodService类的onCreateInputView方法。

(5)onCreateInputView方法需要返回与第3步建立的布局文件对应的View对象。在返回之前,一般需要设置相应控件的事件,如软键盘按钮单击事件。

(6)在输入法服务类或其他类中编写响应软键盘中按键事件的代码,如按钮单击事件、物理键盘事件等。


下面就来实现一个简单的输入法程序。

第一步:新建一个Android工程命名为simple_inputmethod目录结构如下图:


第二步:建立一个AndroidInputMethodService类,该类继承自InputMethodService,然后在Android.Manifest.xml文件中配置:

AndroidInputMethodService类:

package net.csdn.leigo.inputmethod;import net.csdn.leigo.inputmethod.R;import android.inputmethodservice.InputMethodService;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.view.inputmethod.EditorInfo;import android.view.inputmethod.InputConnection;import android.widget.Button;public class AndroidInputMethodService extends InputMethodService implementsOnClickListener {}

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="net.csdn.leigo.inputmethod"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="10"        android:targetSdkVersion="10" />    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <!-- Optional: an activity for controlling the IME settings -->        <activity android:name="net.csdn.leigo.inputmethod..InputMethodSetting" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />            </intent-filter>        </activity>        <!-- Declares the input method service -->        <service            android:name="net.csdn.leigo.inputmethod.AndroidInputMethodService"            android:permission="android.permission.BIND_INPUT_METHOD" >            <intent-filter>                <action android:name="android.view.InputMethod" />            </intent-filter>            <meta-data                android:name="android.view.im"                android:resource="@xml/method" />        </service>    </application></manifest>
配置输入法服务时必须设置
android.permission.BIND_INPUT_METHOD"
权限,并且在<intent-filter>标签中添加一个
"android.view.InputMethod" 
动作。

在<service>标签中还加入一个<meta-data>标签,用于配置输入法,也就是在“语言与键盘”设置界面可以看到我们编写的输入法,其中android:resource属性制定了

一个输入法资源ID。这个资源文件(method.xml)在res\xml目录中,代码如下:

<?xml version="1.0" encoding="UTF-8"?><input-method xmlns:android="http://schemas.android.com/apk/res/android"    android:settingsActivity="net.csdn.leigo.inputmethod.InputMethodSetting"/>

<input-method>标签的android:settingActivity属性可以制定输入法设置窗口。


InputMethodSetting.java:

package net.csdn.leigo.inputmethod;import android.app.Activity;import android.os.Bundle;public class InputMethodSetting extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.setting);}}

setting.xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="horizontal" >    <TextView        android:id="@+id/textview"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="输入法设置窗口" /></LinearLayout>



第三步:编写一个布局文件。这个布局文件实际上就是软键盘的布局。在这个布局中有5个水平排列的按钮,其中前4个用于输入4个字符串(就是<Button>标签的android:text属性值),最后一个按钮用于隐藏软键盘:

keyboard.xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal" >    <Button        android:id="@+id/btn1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="a" />    <Button        android:id="@+id/btn2"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="6dp"        android:text="b" />    <Button        android:id="@+id/btn3"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="6dp"        android:text="c" />    <Button        android:id="@+id/btn4"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="6dp"        android:text="d" />    <Button        android:id="@+id/btn_hide"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="6dp"        android:text="Hide" /></LinearLayout>

第四步:修改AndroidInputMethodService类的代码,首先覆盖onCreateInputView方法,然后在onCreateInputView方法中装载keyboard,xml布局文件,并设置按钮的单击事件,最后返回软键盘的View对象。

@Overridepublic View onCreateInputView() {// 装载keyboard.xml文件View view = getLayoutInflater().inflate(R.layout.keyboard, null);// 设置布局中5个按钮的单击事件view.findViewById(R.id.btn1).setOnClickListener(this);view.findViewById(R.id.btn2).setOnClickListener(this);view.findViewById(R.id.btn3).setOnClickListener(this);view.findViewById(R.id.btn4).setOnClickListener(this);view.findViewById(R.id.btn_hide).setOnClickListener(this);Log.d(TAG, "onCreateInputView()");// 返回View对象return view;}

注意:输入法界面(软键盘)并不许要我们自己建立Activity,这个Activity是由系统提供的,而我们只需要在Activity上显示的View对象即可,也就是onCreateInputView方法的返回值。


最后一部需要处理按钮的单击动作,AndroidInputMethodService类需要实现OnClickListener接口。

@Overridepublic void onClick(View v) {if (v.getId() == R.id.btn_hide) {// 隐藏软键盘hideWindow();} else {Button button = (Button) v;// 获得InputConnection对象InputConnection inputConnection = getCurrentInputConnection();if (button.getId() == R.id.btn1) {// 设置预输入文本// setComposingText方法的第2个参数值为1,表示在当前位置预输入文本inputConnection.setComposingText(button.getText(), 1);} else {// 向当前获得焦点的EditText控件输出文本// commitText方法第2个参数值为1,表示在当前位置插入文本inputConnection.commitText(button.getText(), 1);}}}
通过InoutConnection.setComposingText方法可以预输入文本。预输入文本一般会在输入的文本下方显示一个下划线,直到将其替换成正式输入的文本,否则下划线一直存在。


运行工程查看效果图:

经测试,如果EditText的inputType属性为默认时,点击可以输入,但是若是其他的例如phone或者email之类,点击就没有什么效果。这个可以参考文档或者在下一篇会有介绍。

更多相关文章

  1. Android(安卓)Material Design-Maintaining Compatibility(保持
  2. Android中关于键盘管理,点击除editText外的区域收起键盘
  3. Android(安卓)SearchView设置与用法的那点事儿
  4. 【Android面试】Android面试题集锦 (陆续更新)
  5. [译]三分钟玩转Android(安卓)Bottom Sheet
  6. android开发笔记之LayoutInflater的理解和使用
  7. android 文本框(textview)左右滑动
  8. widget开发实例代码
  9. android 按键映射qwerty.kl文件中的WAKE和WAKE_DROPPED的定义

随机推荐

  1. 【Android】ListAdapter的常用的子类
  2. android图库竖屏不显示status bar的解决
  3. 检测 android ethernet 支持 IPV6 否
  4. android studio如何连接夜神模拟器
  5. Android(安卓)Studio代理以及证书导入
  6. 小米开源文件管理器MiCodeFileExplorer-
  7. android帮助文档打开慢的三种解决方法
  8. Android(安卓)RecyclerView之ListView显
  9. eclipse启动时报错org.eclipse.core.runt
  10. Android之如何获取网络类型并判断是否可