简化Android Click Listener

Android 在过去半年时间里更新 SDK 的速度真是快,从4月28日发布 Cupcake,到9月16日发布 Donut,再到10月28日发布 Eclair,刚刚好半年时间,版本号从1.1扶摇直上,直至升级到了2.0。这么频繁的更新,可以有两种解读:一是 Google 投入了大量的资源来促进 Android 的发展,二是 Google 没有做好Android的规划。

作为开发者,我更愿意看到第一种解读。每一次升级,Android SDK 都会带来不少新的功能。1.6发布后,Android 团队在其官方博客上介绍了对 OnClickListener 的优化

很多开发者开始接触 click 事件时,总是会看到标准的实现样式,如下所示:

findViewById(R.id.myButton).setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        // Do stuff
    }
});

假设说 Layout 当中存在若干 Button,则需要对每个 Button 调用 setOnClickListener,并且实例化一个 View.OnClickListener() 对象,实现 onClick 方法。如此这般下来,代码显得比较臃肿。

掌握了基本的 click 处理模式之后,开发者很快就会发明另一种简洁的做法,那就是在不同的 Button 之间共享同一个 View.OnClickListener() 对象。

View.OnClickListener handler = View.OnClickListener() {
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.myButton: // doStuff
                break;
            case R.id.myOtherButton: // doStuff
                break;
        }
    }
}
 
findViewById(R.id.myButton).setOnClickListener(handler);
findViewById(R.id.myOtherButton).setOnClickListener(handler);

而 Android SDK 1.6 则提供了更为快捷的方法,在 Activity 里创建一个 public 的方法(参数 View 是不可少的),然后在 Layout 方法里直接给它“注入”进去。

class MyActivity extends Activity {
    public void myClickHandler(View target) {
        // Do stuff
    }
}
<Button android:onClick="myClickHandler" />

这样一来是不是更省事了?我们可以有更多时间来想想如何让应用更具创意。

1 Comment

zhugw51929 12 月, 2009 at 5:06 下午

谢谢,从你这我学到许多知识,真的很感谢!

Leave a comment

Your comment