当前位置: 代码迷 >> Android >> Android 怎么在自定义界面下启用输入法 (How to enable inputmethod for the custom UI) 转
  详细解决方案

Android 怎么在自定义界面下启用输入法 (How to enable inputmethod for the custom UI) 转

热度:257   发布时间:2016-05-01 11:27:41.0
Android 如何在自定义界面上启用输入法 (How to enable inputmethod for the custom UI) 转

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

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

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

1public?InputConnection onCreateInputConnection(EditorInfo outAttrs) {}

?

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

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

01class?MyInputConnection?extends?BaseInputConnection{
02?
03????????String inputString="";
04?
05????????public?MyInputConnection(View targetView,?booleanfullEditor) {
06????????????super(targetView, fullEditor);
07????????????// TODO Auto-generated constructor stub
08????????}
09????????public?boolean?commitText(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里需要用户输入的时候,

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

?

即可以调用出输入法。

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

view source
print?
01importandroid.content.Context;
02importandroid.graphics.Canvas;
03importandroid.graphics.Color;
04importandroid.graphics.Paint;
05importandroid.view.SurfaceHolder;
06importandroid.view.SurfaceHolder.Callback;
07importandroid.view.SurfaceView;
08importandroid.view.View;
09importandroid.view.inputmethod.BaseInputConnection;
10importandroid.view.inputmethod.CompletionInfo;
11importandroid.view.inputmethod.EditorInfo;
12importandroid.view.inputmethod.InputConnection;
13importandroid.view.inputmethod.InputMethodManager;
14???
15public?class?SufaceInput?extends?SurfaceView?implementsSurfaceHolder.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????public?void?surfaceChanged(SurfaceHolder holder,?int?format,?intwidth,
32????????????intheight) {
33????????// TODO Auto-generated method stub
34????????newThread(this).start();
35????????input.showSoftInput(this,?0);
36????}
37?
38????public?voidsurfaceCreated(SurfaceHolder holder) {
39????????// TODO Auto-generated method stub
40?????????
41????}
42?
43????public?voidsurfaceDestroyed(SurfaceHolder holder) {
44????????// TODO Auto-generated method stub
45?????????
46????}
47?
48????class?MyInputConnection?extends?BaseInputConnection{
49?
50????????public?MyInputConnection(View targetView,?booleanfullEditor) {
51????????????super(targetView, fullEditor);
52????????????// TODO Auto-generated constructor stub
53????????}
54????????public?boolean?commitText(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????????return?newMyInputConnection(this,false);//super.onCreateInputConnection(outAttrs);
65????}
66?
67????public?voidrun() {
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}
  相关解决方案