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 中如何将带有html格式的文章转换成能在Android中显示的
  2. android:layout_marginLeft指该控件距离边父控件的边距, android:
  3. Android输入法扩展之外接键盘中文输入
  4. Android—文字轮播
  5. Android自由选择TextView的文字
  6. Android 采用DOM解析XML内容 【学习记录】
  7. Android studio 3.0和unity交互 Manifest文件修改后正确的内容
  8. android 进入页面隐藏输入法
  9. Android EditText输入内容时挤压上面的activity的解决办法

随机推荐

  1. Android XML Pull解析
  2. android 资源和国际化
  3. Android(安卓)Studio错误Error:(23, 17)
  4. Android上的内存分配策略优化
  5. Android的崛起之路与束足之绳
  6. Android 怎样击败 iPhone ?
  7. Android(安卓)Studio 集成JPUSH推送
  8. 仿网易新闻效果源码分析
  9. 使用Tortoise SVN版本控制Android项目in
  10. 【android】两类不能在SDK中使用的API---