转自: http://blog.csdn.net/le_go/article/details/9264831#comments
参考文档: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 implements OnClickListener { }
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 { @Override protected 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对象。
@Override public 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接口。
@Override public 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 if (button.getId() == R.id.del) { // 删除字符 , 第一个参数 删除光标前几个,第二个参数 删除光标后几个 // deleteSurroundingText(int beforeLength, int afterLength) inputConnection.deleteSurroundingText(1, 0); }else { // 向当前获得焦点的EditText控件输出文本 // commitText方法第2个参数值为1,表示在当前位置插入文本 inputConnection.commitText(button.getText(), 1); } } // setInputView(view); 切换显示的键盘 布局view }
通过InoutConnection.setComposingText方法可以预输入文本。预输入文本一般会在输入的文本下方显示一个下划线,直到将其替换成正式输入的文本,否则下划线一直存在。
运行工程查看效果图:
经测试,如果EditText的inputType属性为默认时,点击可以输入,但是若是其他的例如phone或者email之类,点击就没有什么效果。这个可以参考文档或者在下一篇会有介绍。
-------------------------------
再 感谢原作者的 无私分享
相关推荐
实验1主要涵盖了Android基础入门和UI开发应用,旨在让学生掌握Android开发中的关键概念和技术。实验内容包括了两个部分,一是创建“手机信息页面”,二是实现“智能输入法”程序。 在第一部分,实验目的是理解并...
### Android开发入门知识点详解 #### 一、核心概念(Part I: Core Concepts) **1.1 大局观(Chapter 1: The Big Picture)** - **知识点:** - Android平台简介 - Android应用架构 - 应用组件(Activity、...
- 介绍Android输入法的实现机制。 - 讨论如何在应用中自定义输入法。 - 解释软键盘和其他输入设备的集成方法。 - **第12章:选择控件的使用** - 介绍CheckBox、RadioButton等选择型控件的使用场景。 - 提供...
输入法编程开发文档详细资料是一份综合性的学习资源,它为想要涉足输入法开发的初学者提供了宝贵的指导。这份文档深入浅出地介绍了输入法的工作原理、设计思路以及实现技术,帮助开发者理解输入法的核心机制。 ...
在IT领域,输入法是人机交互的重要环节,特别是在移动设备上,一款好的输入法能够极大地提高用户在小屏幕上输入文字的效率和舒适度。"最简单的输入法"标题所指,显然是一款专为手机设计的简洁易用的输入工具。这款...
14 6 输入法开发 14 7 测试驱动开发 14 8 性能优化">下载一个cebx阅读器即可 《Android高薪之路:Android程序员面试宝典》目录: 第1章 Android入门 1 1 关于Android的非技术问题 1 1 1 为什么看好 Android 1 1 2 ...
跨平台开发能力是Qt框架的一个重要特点,它支持许多操作系统,如Windows、Mac OS X、Linux、Unix、Android和iOS等。 标签"qt"为我们指明本文档的主题焦点,即所有的内容都是围绕Qt框架的使用和开发技巧。 根据提供...
### 核心知识点总结 #### 一、核心概念(Part I: Core Concept) ...以上是《Beginning Android 4》一书中涉及的部分关键知识点总结,覆盖了Android开发的基础到进阶的各种主题,适合初学者系统地学习Android开发。
标题中的"CEF4Delphi-入门-1_delphi_CEF_web_"指的是一个关于在Delphi中使用CEF(Chromium Embedded Framework)开发Web浏览器的教程的第一部分。CEF是一个开源框架,它允许开发者将Google Chrome的渲染引擎嵌入到...
### 开始Android 2之旅 本书《Beginning Android 2》由Mark L. Murphy撰写,旨在为初学者提供全面且...无论是想要入门Android开发的新手,还是希望深入学习特定领域的开发者,都能够从本书中获得宝贵的指导和启发。
使您可以在Windows,macOS,Linux,iPhone,iPad,Android平板电脑和手机上输入任何语言,甚至可以在Web浏览器中即时输入。 使用Keyman Developer创建键盘布局,并与的社区共享它们。 已经为1,500多种语言提供了键盘...
### Android Core Service详解 #### 一、为什么要开发底层的核心服务?...通过以上介绍,我们可以了解到Android核心服务的重要性和开发流程,这对于深入理解Android系统架构以及进行高性能开发非常有益。
QT方面的学习资料共20本,包含c++ gui Qt4编程第二版,c++ Qt5范例开发大全,qt QML葵花宝典,Qt Creator快速入门,Qt on Android核心编程,Qt及Linux操作系统窗口设计,QT5编程入门, Qt5开发实践, Qt 5.10 GUI完全...
1. **语音识别**:讯飞SDK提供了强大的语音识别能力,能够将用户的语音输入转化为文字,支持多种语言和方言,适用于各种语音输入场景,如语音搜索、语音输入法等。它的高准确率和实时性是其显著特点。 2. **语音...
MTK6572,全称为MediaTek MT6572,是由联发科技(Mediatek)开发的一款双核处理器,广泛应用于入门级智能手机和平板电脑。这个语言包的发布,意味着用户可以在其设备上享受更加本地化的用户体验,尤其是在操作系统的...
Android™是一种开放源代码的操作系统,由Google开发并维护,主要用于移动设备,如智能手机和平板电脑。它基于Linux内核,并提供了一个用户友好且高度可定制化的平台。 **优点:** - **个性化定制:** 用户可以根据...