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

从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

Skype的一些想法

最近几天在玩Skype,我有一个习惯,拿来一个新鲜的东西之后,就考虑他还有什么用。拿来Skype之后,自然也不例外,虽然我上面的朋友没有几
个,也经常不上线,但是功能我大体上还是弄清楚了,对于其起源与原理也略有了一点点了解,接下来,由于朋友使用Skype的并不多,我也找不到人聊,自然
就是琢磨这小东西还有什么作用了。

既然Skype是免费的,属于P2P的软件,那样的话,聊天自然就要找人了,这东西用在一些社区网站上应
该不错,以前出现以及现在也有的语音聊天室,如果采用Skype的话,可以好好的利用这一免费的软件了,只要加入其中,大家在找到聊友之后,就可以畅所欲
言了。为Skype找朋友,这对于Skype来说,也解决了一个初期的用户群的培养问题了。

Skype还可以用来做客服,现在许多的企业都
建立起呼叫中心了,为大家服务,当然现在都是基于电话形式的,你打一个电话过去,自然有工作人员为你服务,但是电话的成本可是很高的,无论是用户还是客服
中心,都要付出一定的费用给电信,而如果基于Skype呢。客服务人员将Skype列在一个可选的页面里,用户有问题可以直接向客服来提问,这比论坛好多
了,毕竟人多嘴杂,在论坛上的服务总是让用户感觉到是那么贴心。毕竟一对一的服务更好一点。这样虽然不能够取代电话的客服,但是也可以降低费用。而且对于
象一些与网络有关的项目,这样完全是可以用的。

用在象Taobao.com这样的网站中,让用户面对面的砍价。呵呵毕竟,中国习惯将价格砍
了又砍,不然觉得太高,而砍价以文字来砍毕竟太文绉绉了,看那个老太太在菜市场上说着教授一样的话在砍价,同样,象砍价这样激烈的对峙,当然是声音最直接
了,而且也减少了不少的误解。象因为打字错误而造成的误解已经不计其数了。让淘宝集成Skype,不错的选择。

再一个就是将Skype做到
网络游戏中,现在的网络游戏之火爆自然是不用提了,现在的网游的服务却成了不少玩家痛心的事情,如果将Skype放到网游中,以他为客服,相信应该更适合
吧。因为网络游戏本来就离不开网络,而加一个这样的功能,完全是合理的。除了作为客服,让玩家可以直接在网络游戏中进行语音的聊天,相信对于玩家之间的合
作也应该更好吧,况且是P2P的,不会对服务器增加任何的负担,一切由Skype为你提供服务,而网络游戏所要做的就是将之集成到自己的游戏界面中去而
矣。

Skype的用处还会有很多,我现在只想到这几点,仔细想一想,应该还有别的用途的,呵呵,就象Gmail的出现一样,每个人都会有不同的玩法的

– 作者: batfree 2004年11月12日, 星期五 21:27

3721这样算不算是抢劫我的浏览器?

不知道从什么时候开始,我打开网站的时候经常会出现连接不上的提示,然后就会转到一个Yahoo!3721的页面,建议我有用yisou来搜索一
下。这样的事情刚刚出现的时候我没有在意,以为这只是3721的网络实名的一种服务,虽然我没有安装3721,但是听说其与微软的IE结合了,所以出现一
次也没有什么。但是这样的事情出现的次数越来越多了,我的IE经常打不开网站了,几乎只要我在IE地址栏里输入网站地址,马上就会弹出一具yiSou的页
面,说什么你找的网页无法打开,建议你用yisou.com搜索一下,然后列给我一个搜索框,当然了,旁边少不得有一堆的广告了。而且将我输入在地址栏的
几个网址象模象样的发行了一下,然后问我是不是想打开这些网址,好象是因为我输入错误才出现的问题,但是实际情况是,我的输入的网址并没有错,这些网址几
乎是人人都记得了,刚开始的时候是一些比较小的网站会打不开,然后被导航到了yisou去了,但是我发现这样的事情越来越多了,几乎我打开每个网站都会出
现这样的事情,而且就是在我打开象sina.com.cn,www.csdn.net,sohu.com,163.com的时候也会出现这样的问题,现在害得我几乎每打开一个网站都要输入两遍到三遍了,我不知道这是怎么回事。如果是一些小的网站,因为带宽的问题可能暂时连接不上,但是如果象中国的三大门户网站也连不上的话,我就要考虑一下了。


果是我接入网络的带宽有问题,那应该是什么网页都无法打开,或者是直接给我一个页面无法打开的页面就行了,但是明明又能够连接到yisou3721的页面
呀。难道是新浪,搜狐的服务器带宽有问题吗?那不应该呀,难道新浪的带宽会比3721的少,能打开3721却打不开新浪。

我仔细研究了一
下,我在山东的时候,打不开的时候,会出现雅虎3721的页面,同时出现的是山东网通的建议,现在在上海,出现也是同样的界面,但是出现的提示就是上海热
线了。看来是ISP的问题。ISP难道无私的为3721在做广告吧?难道3721的服务这样感动人,让一向高高在上的电信与网通都觉得应该向用户无私的推
荐使用吗?还是雅虎3721与ISP合作,将广告做到了ISP的服务器上,让ISP将用户的页面引导到3721的页面呢?据我推断,后者的可能性应该是比
较大的,因为这世界本来就没有免费的午餐,ISP不可能无偿的为雅虎3721做广告的,即使连接不到新浪,大不了来个打不开页面就是了,没有用户会埋怨他
的。

如果真的是3721伙同ISP绑架了我们的浏览器,我们应该怎么办呢?以前大家声讨的IE地址栏的绑架,现在大家都有了防治的办法了,也起不到什么作用了。但是如果ISP绑架了你的浏览器,我们能做些什么呢?

 

不知道其他人是不是遇到过同样的问题呢?

– 作者: batfree 2004年11月12日, 星期五 20:46

我是不是得了新闻饥渴症

最近经常上网,突然觉得有点走火入魔的感觉,我最关心的是IT的技术之类的文章,象BLOG,J2ME,LINUX,以及Java,Brew,PHP,反
正与IT沾过的内容我都关心,于是天天在几个网站之间转悠,寻找新鲜的新闻或者是消息,但是可惜的很,新闻读起来很快的,但是发生起来却是需要一定的时间
的,每天的最新的IT新闻也就是一两条,当然了象一些明星的花边新闻倒是不少,再象一些如谁家的狗咬人了之类的也不少,但可惜的是我不关心,所以仅有的那
几条IT新闻被我嚼来嚼去,一直到无味,而那几份我所关心的杂志,如《程序员》和《个人电脑》是一个月来一份,每个月初我就开始向报亭的老头打听我要的杂
志到了没有,呵呵,从一号开始,后来那老头看到我就只说一句话了,"还没有到"。
我想我是不是得了IT新闻饥渴症了呢?原来以为世界这么大,而且互联网可以将的所有的消息一网打尽,一定会有无数的新鲜东西可以满足我猎取奇心理,但是我
错了,这个世界上每天新鲜事其实并不多,更多的是人们的无聊的争执。现在天天的上网,天天的寻找新鲜的新闻,这几乎成了习惯了。我怀疑,是不是得了新闻饥
渴症,这是不是一种新的网络症状呢?
我应该怎么办呢?

– 作者: batfree 2004年11月12日, 星期五 19:27

Design a site like this with WordPress.com
Get started