http://www.oschina.net/question/54100_39046

在android中经常会自定义组件,自定义的组件可以通过继承系统的已经有的组件来实现。也可以直接继承自View或者是SurfaceView 界面。有时候想在这些界面中输入文字,例如游戏中经常用到的SurfaceView上让用户输入文字。由于多数android都没有实体的输入键盘,另外 android中都启用了输入法功能,如非英文用户都需要安装指定的输入法等。 因此在这些界面中输入文字首先需要调用输入法功能。

在Android中,输入法(IME)是通过InputMethodService来提供的。 你要做的是在你的view里面启动输入法。 在View里面启用输入法,需要实现的方法是

这个方法会返回一个InputConnection对象。 InputCo

1 public InputConnection onCreateInputConnection(EditorInfo outAttrs) {}

nnection就是建立你的View与InputMethodService之间的桥梁。输入法就是通过IntputConnection将文字内容传输到View当中。

为了实现输入功能,我们需要创建自己的InputConnection类。 他的作用是接收输入法提交的内容,并可以对输入法提交的文字内容进行做进一步的处理。

01 class MyInputConnection extends BaseInputConnection{
02  
03         String inputString="";
04  
05         public MyInputConnection(View targetView, boolean fullEditor) {
06             super(targetView, fullEditor);
07             // TODO Auto-generated constructor stub
08         }
09         public boolean commitText(CharSequence text, int newCursorPosition){
10             inputString=inputString+(String) text;
11             return true;
12         }
13          
14     }

MyInputConnection继承自BaseInputConnection,BaseInputConnection继承自 InputConnection。 这里面必须要实现的一个方法就是public boolean commitText(CharSequence text, int newCursorPosition), 第一个参数text就是输入法在完成一次输入时提交的文字内容。我们现在直接保存到inputString中, 这样输入法输入的内容会源源不断的添加到nputString中。我们只需要读取inputString就可以得到输入法输入的文字。

接下来要帮的是在需要输入的时候显示出输入法。 当view里需要用户输入的时候,

1 InputMethodManager  input=(InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
2 input.showSoftInput(this,0);

即可以调用出输入法。

以下代码是我在SurfaceView里做的一个演示。

01 import android.content.Context;
02 import android.graphics.Canvas;
03 import android.graphics.Color;
04 import android.graphics.Paint;
05 import android.view.SurfaceHolder;
06 import android.view.SurfaceHolder.Callback;
07 import android.view.SurfaceView;
08 import android.view.View;
09 import android.view.inputmethod.BaseInputConnection;
10 import android.view.inputmethod.CompletionInfo;
11 import android.view.inputmethod.EditorInfo;
12 import android.view.inputmethod.InputConnection;
13 import android.view.inputmethod.InputMethodManager;
14    
15 public class SufaceInput extends SurfaceView implements SurfaceHolder.Callback , Runnable {
16     SurfaceHolder holder=null;
17     String inputString="xyz";
18     InputMethodManager input=null;
19     public SufaceInput(Context context) {
20         super(context);
21         holder=this.getHolder();
22         holder.addCallback(this);
23         this.setFocusable(true);
24         this.setFocusableInTouchMode(true);
25          
26         input=(InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
27          
28         // TODO Auto-generated constructor stub
29     }
30  
31     public void surfaceChanged(SurfaceHolder holder, int format, int width,
32             int height) {
33         // TODO Auto-generated method stub
34         new Thread(this).start();
35         input.showSoftInput(this0);
36     }
37  
38     public void surfaceCreated(SurfaceHolder holder) {
39         // TODO Auto-generated method stub
40          
41     }
42  
43     public void surfaceDestroyed(SurfaceHolder holder) {
44         // TODO Auto-generated method stub
45          
46     }
47  
48     class MyInputConnection extends BaseInputConnection{
49  
50         public MyInputConnection(View targetView, boolean fullEditor) {
51             super(targetView, fullEditor);
52             // TODO Auto-generated constructor stub
53         }
54         public boolean commitText(CharSequence text, int newCursorPosition){
55             inputString=inputString+(String) text;
56             return true;
57         }
58          
59     }
60  
61     @Override
62     public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
63         // TODO Auto-generated method stub
64         return newMyInputConnection(this,false);//super.onCreateInputConnection(outAttrs);
65     }
66  
67     public void run() {
68         // TODO Auto-generated method stub
69         while(true){
70             Canvas c=holder.lockCanvas();
71             Paint p=new Paint();
72             p.setColor(Color.RED);
73             c.drawColor(Color.WHITE);
74             c.drawText(inputString, 100100, p);
75             holder.unlockCanvasAndPost(c);
76              
77         }
78     }

更多相关文章

  1. Android计算器低级错误?都是二进制惹的祸!
  2. Android(安卓)客户端访问服务器以及服务器开发
  3. Android(安卓)开发手记之NDK 编程实例
  4. 我和我的Android
  5. android使用webview上传文件(支持相册和拍照)
  6. android学习
  7. Android(安卓)Material Design(7) 转场动画的使用
  8. Android(安卓)CTS Debug
  9. 【Android】Menu不同菜单的使用介绍

随机推荐

  1. 【Android(安卓)Developers Training】 1
  2. 一起学android之如何获取网络类型并判断
  3. MTK Android(安卓)Driver知识大全
  4. 我的第一个 Mono for Android(安卓)应用
  5. Android(安卓)Camera(五)
  6. 安卓开发环境AS2.0搭建
  7. android adb shell 笔记
  8. android点击事件
  9. android的学习(一)环境搭建
  10. Android(安卓)AIDL 教程 (一)—— 简单的