免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1673 | 回复: 0
打印 上一主题 下一主题

android surfaceview 调用 输入法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-22 08:51 |只看该作者 |倒序浏览
android surfaceview 调用 输入法

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

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

public InputConnection onCreateInputConnection(EditorInfo outAttrs) {}

这个方法会返回一个InputConnection对象。 InputConnection就是建立你的View与InputMethodService之间的桥梁。输入法就是通过IntputConnection将文字内容传输到View当中。

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

class MyInputConnection extends BaseInputConnection{

        String inputString="";

        public MyInputConnection(View targetView, boolean fullEditor) { 
            super(targetView, fullEditor); 
            // TODO Auto-generated constructor stub 
        } 
        public boolean commitText(CharSequence text, int newCursorPosition){ 
            inputString=inputString+(String) text; 
            return true; 
        } 
        
    }

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

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

InputMethodManager  input=(InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);

input.showSoftInput(this,0);即可以调用出输入法。

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

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.view.SurfaceHolder; 
import android.view.SurfaceHolder.Callback; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.inputmethod.BaseInputConnection; 
import android.view.inputmethod.CompletionInfo; 
import android.view.inputmethod.EditorInfo; 
import android.view.inputmethod.InputConnection; 
import android.view.inputmethod.InputMethodManager; 
  
public class SufaceInput extends SurfaceView implements SurfaceHolder.Callback , Runnable { 
    SurfaceHolder holder=null; 
    String inputString="xyz"; 
    InputMethodManager input=null; 
    public SufaceInput(Context context) { 
        super(context); 
        holder=this.getHolder(); 
        holder.addCallback(this); 
        this.setFocusable(true); 
        this.setFocusableInTouchMode(true); 
        
        input=(InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); 
        
        // TODO Auto-generated constructor stub 
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
            int height) { 
        // TODO Auto-generated method stub 
        new Thread(this).start(); 
        input.showSoftInput(this, 0); 
    }

    public void surfaceCreated(SurfaceHolder holder) { 
        // TODO Auto-generated method stub 
        
    }

    public void surfaceDestroyed(SurfaceHolder holder) { 
        // TODO Auto-generated method stub 
        
    }

    class MyInputConnection extends BaseInputConnection{

        public MyInputConnection(View targetView, boolean fullEditor) { 
            super(targetView, fullEditor); 
            // TODO Auto-generated constructor stub 
        } 
        public boolean commitText(CharSequence text, int newCursorPosition){ 
            inputString=inputString+(String) text; 
            return true; 
        } 
        
    }

    @Override 
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) { 
        // TODO Auto-generated method stub 
        return new MyInputConnection(this,false);//super.onCreateInputConnection(outAttrs); 
    }

    public void run() { 
        // TODO Auto-generated method stub 
        while(true){ 
            Canvas c=holder.lockCanvas(); 
            Paint p=new Paint(); 
            p.setColor(Color.RED); 
            c.drawColor(Color.WHITE); 
            c.drawText(inputString, 100, 100, p); 
            holder.unlockCanvasAndPost(c); 
            
        } 
    } 
}

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP