Android事件监听器三种实现方法

一、绑定事件监听器(bn.setOnClickListener(this)

这是一种基于监听的事件处理机制,具体步骤如下:

  • 获取界面组件的事件源,也就是被监听的对象。比如:
    Button bn=(Button)findViewById(R.id.bn) ;
  • 为事件源(组件)绑定监听器。比如:
    bn.setOnClickListener(new MyClickListener());
  • 实现监听器接口(View.OnClickListener)。比如
     class MyOnClickListener implements View.OnClickListener {}

绑定监听器的启动方式又可以细分为三种:

  • 内部类作为事件监听器类
  • 匿名内部类类作为事件监听器类
  • 外部类作为事件监听器类

下面我们逐一介绍:

 1.内部类作为事件监听器类

public class InnerClassListener extends Activity {
    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.inner_activity);
        //获取对应的Button
        button=(Button)findViewById(R.id.button);
        //为button设置监听器,方法内要新建一个自己的监听器MyOnClickListener()
        button.setOnClickListener(new MyOnClickListener());
    }

    //实现自己的监听器,实现接口OnClickListener
    private class MyOnClickListener implements View.OnClickListener {
        @Override
        //实现OnClickListener()的onClick()方法
        public void onClick(View v) {

            //点击后的相关操作,这里也可以写其他的操作
            Toast.makeText(InnerClassListener.this
                    ,"SUCCESS",Toast.LENGTH_SHORT).show();
        }
    }
}

​
布局文件只有一个Button,这里就不给出啦。

2.匿名内部类作为事件监听器类

public class AnonymousInnerClassListener extends Activity {

    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.anonymous_activity);
        //获取对应的Button
        button=(Button)findViewById(R.id.button);
        /*为button设置监听器,方法内直接新建一个OnClickListener()
        *并且直接实现onClick()
        */
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            //实现OnClickListener()的onClick()方法
            public void onClick(View v) {
                //点击后的相关操作,这里也可以写其他的操作
                Toast.makeText(AnonymousInnerClassListener.this
                        ,"SUCCESS",Toast.LENGTH_SHORT).show();
            }
        });
    }
}

比较以上两个代码可知,内部类实现方式和匿名内部类实现方式,大体上是一样的。只是内部类选择创建属于自己的监听器

MyOnClickListener(),然后再让自己的监听器实现接口 OnClickListener()的相关方法(其实只有一个方法onClick())。

而匿名内部类实现方法简化了过程,并没有创建自己的监听器,而是通过直接实现OnClickListener()来完成创建监听器这个过程。

布局文件只有一个按钮。

3.外部类作为事件监听器

 代码分两部分:主Activity和OnClickListener的实现类

//OnClickListener 的实现类
class MyOnClickListener implements View.OnClickListener {
    private OutClassListener outClassListener;
    //OnClickListenerd的构造函数
    public MyOnClickListener(OutClassListener outClassListener) {
        this.outClassListener = outClassListener;
    }

    @Override
    public void onClick(View v) {
        //点击后的相关操作,这里也可以写其他的操作
        Toast.makeText(outClassListener
                ,"SUCCESS",Toast.LENGTH_SHORT).show();
    }
}
//主Activity
public class OutClassListener extends Activity {
    private Button out_bn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.out_activity);
        //获取对应的Button
        out_bn=(Button)findViewById(R.id.button);
        //为button设置监听器,方法内要新建一个自己的监听器MyOnClickListener()
        out_bn.setOnClickListener(new MyOnClickListener(this));
    }
}

那么为什么会出现内部类、匿名内部类和外部类这么多的形式。其实熟悉JAVA基础的人很容易就会想到这是JAVA实现接口的相关形式。这不是Android赋予监听器的形式,而是JAVA语法本身赋予的形式。那么为什么有这么多形式呢?那是应为每一种形式都有它的优点和缺点。下面我们就说一下这三种形式的优缺点。

内部类:

1.监听器作为外部类的内部类可以自由的访问外部类的所有界面组件

2.使用内部类可以在当前类中复用该监听器类

匿名内部类:

大多数事件处理器都没有什么复用价值,因此大部分时间监听器只是临时使用一次。这时使用匿名内部类能简化代码,使代码看上去更紧凑。

外部类:

1.事件监听器通常属于特定的GUI界面,定义成外部类不利于提高程序的内聚性

2.外部类监听器不能自由访问GUI界面的类中的组件,变成不够简洁。

外部类很少使用,但是当某个监听器需要同时被多个GUI界面共享时就需要用到外部类监听器。(详细情况不再展开)

二、Activity本身作为事件监听器

1.Activity界面实现监听器接口,让人感到怪异。(使用熟练后就不会感到怪异啦)

2.这种形式可能造成程序混乱,Activity的主要职责是完成初始化界面工作,但此时还要用来实现事件监听器,从而引起混乱。

个人看法:当Activity的功能不叫简单时,可以使用这一种方法,应为这种形式还是比较简洁的。但是当Activity功能比较复杂是就不要使用这种方法啦,这样会让本不简单的Activity变得更加复杂。

public class ActivityListener extends Activity
implements View.OnClickListener {

    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.act);
        //获取对应的Button
        button=(Button)findViewById(R.id.button);
        //为button设置监听器
        button.setOnClickListener(ActivityListener.this);
    }

    @Override
    public void onClick(View v) {
        //点击后的相关操作,这里也可以写其他的操作
        Toast.makeText(ActivityListener.this
                ,"SUCCESS",Toast.LENGTH_SHORT).show();
    }
}

三、直接绑定到标签

这种方法就是在XML中设置组件的onClick属性,然后再在Activity中实现onClick的相关方法。

布局文件代码如下

?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!--myClick只是一个名字可以随便取-->
    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="myClick"
        android:text="标签监听器"/>
</LinearLayout>

Activity代码如下

public class TagListener extends Activity {

    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tag_activity);
    }
    public void myClick(View view){
        //点击后的相关操作,这里也可以写其他的操作
        Toast.makeText(TagListener.this
                ,"SUCCESS",Toast.LENGTH_SHORT).show();
    }
}

 

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值