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

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

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

1 publicInputConnection onCreateInputConnection(EditorInfo outAttrs) {}

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

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

01 classMyInputConnectionextendsBaseInputConnection{
02
03 String inputString="";
04
05 publicMyInputConnection(View targetView,booleanfullEditor) {
06 super(targetView, fullEditor);
07 // TODO Auto-generated constructor stub
08 }
09 publicbooleancommitText(CharSequence text,intnewCursorPosition){
10 inputString=inputString+(String) text;
11 returntrue;
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里做的一个演示。

view source print ?
01 importandroid.content.Context;
02 importandroid.graphics.Canvas;
03 importandroid.graphics.Color;
04 importandroid.graphics.Paint;
05 importandroid.view.SurfaceHolder;
06 importandroid.view.SurfaceHolder.Callback;
07 importandroid.view.SurfaceView;
08 importandroid.view.View;
09 importandroid.view.inputmethod.BaseInputConnection;
10 importandroid.view.inputmethod.CompletionInfo;
11 importandroid.view.inputmethod.EditorInfo;
12 importandroid.view.inputmethod.InputConnection;
13 importandroid.view.inputmethod.InputMethodManager;
14
15 publicclassSufaceInputextendsSurfaceViewimplementsSurfaceHolder.Callback , Runnable {
16 SurfaceHolder holder=null;
17 String inputString="xyz";
18 InputMethodManager input=null;
19 publicSufaceInput(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 publicvoidsurfaceChanged(SurfaceHolder holder,intformat,intwidth,
32 intheight) {
33 // TODO Auto-generated method stub
34 newThread(this).start();
35 input.showSoftInput(this,0);
36 }
37
38 publicvoidsurfaceCreated(SurfaceHolder holder) {
39 // TODO Auto-generated method stub
40
41 }
42
43 publicvoidsurfaceDestroyed(SurfaceHolder holder) {
44 // TODO Auto-generated method stub
45
46 }
47
48 classMyInputConnectionextendsBaseInputConnection{
49
50 publicMyInputConnection(View targetView,booleanfullEditor) {
51 super(targetView, fullEditor);
52 // TODO Auto-generated constructor stub
53 }
54 publicbooleancommitText(CharSequence text,intnewCursorPosition){
55 inputString=inputString+(String) text;
56 returntrue;
57 }
58
59 }
60
61 @Override
62 publicInputConnection onCreateInputConnection(EditorInfo outAttrs) {
63 // TODO Auto-generated method stub
64 returnnewMyInputConnection(this,false);//super.onCreateInputConnection(outAttrs);
65 }
66
67 publicvoidrun() {
68 // TODO Auto-generated method stub
69 while(true){
70 Canvas c=holder.lockCanvas();
71 Paint p=newPaint();
72 p.setColor(Color.RED);
73 c.drawColor(Color.WHITE);
74 c.drawText(inputString,100,100, p);
75 holder.unlockCanvasAndPost(c);
76
77 }
78 }
79 }

更多相关文章

  1. 微软一年通过Android获得几十亿美元收入,没错,是微软!
  2. Android输入法框架系统(上)
  3. Android: 打印Bundle内容
  4. Android 组件 ContentProvider 内容提供者
  5. Android输入法之输入系统
  6. 待验证内容。
  7. Android TextView内容居中和控件居中

随机推荐

  1. Gson解析json,让json解析不再困难
  2. Android(安卓)代码中设置EditText的hint
  3. TextView文字横向自动滚动(跑马灯)
  4. Android(安卓)framework/base 下添加新的
  5. Android中Context的理解与使用技巧
  6. 一个常见的android内存泄露 问题
  7. android点击EditText外区域收起键盘
  8. Error:more than one library with packa
  9. Android——SeekBar(进度、音量大小的控件
  10. Android中保存图片到本地并更新到相册及