Android 如何在自定义界面上启用输入法 (How to enable inputmethod for the custom UI)

在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);
           
        }
    }
}

Advertisements

从msn到wordpress

从msn迁移到了wordpress了。微软做这么大的决定真是出乎我的意料,以微软的行事风格,不管赚钱不赚钱,重在参与,而live spaces虽然不会给他带来什么好处,不过也粘住了不少用户,虽然难用, 但是用户数量却是不少。 微软能够果断的放弃livespace,这个决定相当不容易。 而越是大的公司,思前想后要考虑的东西越多,微软这个决定有点像ibm一样,开始放弃不赚钱的业务,集中精力了。

同时也说明了wordpress的实力吧。 就是不知道一下子增加3000万用户,wordpress能不能承受得了。 以及中国用户怎么办。

Learning JavaScript

一直在研究网页方式的编程,不过因为各种原因,一直耽误了下来,在见面方面,HTML,CSS,JavaScript三者搭配使用,HTML定义内容,CSS定义布局,JavaScript实现动态交互,这是应该最佳的搭档,随着Web浏览器的标准化和HTML5的发布,网页将会发挥越来越重要的作用,因此在网页上编程也会越来越普及,而且随着AJAX技术的发展,触摸屏手机的普及,网页与应用程序之间的差距越来越小,很多原来需要客户端才能完成的功能将会在网页上完成了,尤其在移动设备上面,随着HTML5的普及,webkit核心浏览器的普及,越来越多的功能将会体现在网页上面。像很多网页现在已经为iPhone优化,google的不少服务,如GMAIL,gtalk等都可以直接在Android上自带的浏览器里面运行,运行效果和本地程序已经非常接近。

在上面的三种技术之中,与程序相关就是JavaScript了。实现这门语言现在也已经用在了非常多的场合。网页上,Ajax,Mozilla Firefox扩展,Chrome扩展,Flash,Web OS的手机软件开发等非常多的领域,因此学习JavaScript将会是必不可少的技能之一了。

由于已经有了很多语言的基础,学习起javascript将不会是难事,尤其是运行环境非常轻易获得,就是手边的浏览器, 因为相信不会用很久。现在就开始吧。

http://kb.operachina.com/node/104 作为web浏览器的生产商,Opera对于推进标准非常积极,这里就是他的教程。可以学到相对标准的用法。

测试一下Windows Live Writer

很久没有关注msn的相关的内容了, 现在hotmail邮箱也很少使用了,基本上只用GMAIL了, 不过这些服务里面,最有价值的可能就是MSN Messenger和Live space,作为一个在国内可以访问并且比较靠谱的运营商,估计是中国用户唯一可选的了。其他的像blogger, wordpress.com,live jounal 等都被GFW拒之墙外,而微软的LIVE SPACE靠着微软的强大公关能力,尚可以访问一二。虽然也发生过微软应中国政府的响应关闭民权人士的blog的事情,但相对于新浪等国内的blog来说尚好,至少不会发生因为你写了半天突然告诉你审核不通过的事情。

现在有了windows live writer这个强大的工具,写起来更靠谱一些,先试试,说不不定要考虑一下重新开始写一写东西了。

装上了windows 7

今天下载了windows 7来试用一下,已经不打算使用VISTA了,看来;WINDOWS 7应该可以让我满意了。 速度以及风格上都比较合我的心意,我已经打算在下一次的系统就转到WINDOWS 7 了。微软看来已经看到现在的时代已经不是他自己可以左右的时代了。随着网络的发展,OS已经变的越来越不重要了。

How to get the size of Display in wxPython

If you using  wxPython. To get the display’s size by wx.DisplaySize()
you will get it.

如何在perfomacing里向live space发布blog

首先要在space里面启用邮件发布。
其次要performacing里用的帐号并不是msn帐号,而是你的空间名称里的帐号。
如http://batfree.spaces.live.com里面的用户名就是batfree
其次是密码,这个密码也不是你的msn密码,而是以第一步里启用邮件发布功能时设置的机密字。只要设置了这两个,你就可以使用performacing来发布了。

powered by performancing firefox