Android View的onClick事件监听


目录

点击事件

findViewById()方法查找对应的view的id

监听事件实现的几种写法


点击事件


Android中Touch事件相关内容都被封装到 MotionEvent 中,MotionEvent 中的时间类型有按下、抬起、滑动和结束事件。这些事件都是人机交互的一个过程,按下动作指的是人手指按在手机屏幕上这个动作,抬起动作指的是人手指按下手机后抬起来这个动作,移动动作指的是人手指按下屏幕后移动一段距离的这个动作。

那么当人手指按下后抬起,就完成了点击(onClick)这个动作。

MotionEvent.ACTION_DOWN:按下(按下动作)

MotionEvent.ACTION_UP:抬起(抬起动作)

MotionEvent.ACTION_MOVE:滑动(滑动动作)

MotionEvent.ACTION_CANCEL:结束事件(非人为)

在onClick事件中我们去监听要去做什么样的动作,通过控件(View)自身的.setOnClickListener(OnClickListener)方法添加onClick事件,除了我们常用的按钮(Button)之外,其他的控件也含有点击事件,通过点击事件的监听可以实现点击按钮之后要发生的动作(业务逻辑)。

 

 

findViewById()方法查找对应的view的id


在资源目录 res 文件夹下的所有资源(文件以及信息)系统都会自动在 gen 目录中的 R.java 文件中生成一个对应且唯一的id。我们可以通过这个唯一的id去查找当前对应的内容。gen目录下的所有文件是不需要我们手动添加和修改的,它是会自动在编译中生成,系统会自动对其进行操作。 

R.id.XXX 这句话中的 R 指的就是 gen 目录中的 R.java 文件,R文件中对应的id指的是我们需要去找的那个控件的id,控件id在我们编辑 xml 布局文件的时候给控件添加 android:id 属性添加,R文件中会自动生成与之对应的 id 值。所以我们访问的是 R.id 中控件 id 对应的系统自动生成的id值。这样子我们就可以访问到当前这个控件。

 

 

 //通过findViewById的方法查找对应View的id
        btnOne = (Button) findViewById(R.id.btn_one);

 

 

监听事件实现的几种写法


1.匿名内部类实现事件监听

2.独立类(外部类)实现事件监听

3.实现OnClickListener接口实现事件监听

4.重写onClick(View view)方法实现事件监听(标签处理)

 

匿名内部类方式

要去监听一个控件(View)的事件,我们需要去初始化控件。

就是说如果我们想要去为一个Button去添加一个点击事件的监听,我们要去找到这个控件才可以对它进行操作和处理。

初始化控件首先是要声明出来一个实体对象,然后对这个对象赋值,找到 xml 布局文件中对应的控件,在java源代码文件中通过 findViewById() 方法访问控件的 id 返回一个控件对象。

然后通过控件对象自身的 .setOnClickListener(OnClickListener) 方法添加点击事件。这样就是通过匿名内部类的方式的点击事件监听。

//声明初始化控件View(Button)
    private Button btnOne;

 //通过findViewById的方法查找对应View的id,查找id和实现监听都写在onCreate()生命周期中
        btnOne = (Button) findViewById(R.id.btn_one);

//匿名内部类实现事件监听
        btnOne.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "通过匿名内部类实现点击事件监听", Toast.LENGTH_SHORT).show();
                tvShow.setText("通过匿名内部类实现点击事件监听");
            }
        });

实现结果:

 

独立类方式

这种实现方式比较少见,看起来跟通过匿名内部类实现事件监听相似,但有些许不同。

通过独立类实现事件监听首先自定义 mOnClickListener 类,该类实现 OnClickListener 接口。然后自定义的监听类会自动生成 onClick 方法,点击控件要进行的操作可以在这里实现。

因为自定义监听类中的onClick方法是public的,所以我们可以覆写也可以不覆写。当覆写OnClick方法的时候会自动生成 super.onClick(view);这个语句是调用父类的onClick方法也就是我们自定义类中onClick方法中实现的内容。

如果我们在覆写的 onClick 方法中写入了实现逻辑,在自定义点击类( mOnClickListener )中也定义了实现逻辑,那么我们在实现覆写的 onClick 方法中的逻辑同时,因为 super.onClick(view); 的原因也会去实现父类中onClick()方法中的实现逻辑。

外部类实现监听 View 点击事件的场景是当很多个控件在实现监听的时候除了实现自己本身需要的逻辑之外,还要实现同样的一个动作,那么就可以通过外部类的方式去实现点击事件的监听,将都需要实现的公共逻辑在外部类中实现,然后在覆写的方法中去实现自己本身需要去实现的业务逻辑。

外部类的写法就是提取一些逻辑内容相同的部分,减少代码的冗余。用不用外部类去实现点击事件的监听主要是看我们有没有遇到需要这样去实现的场景。

class mOnClickListener implements View.OnClickListener {

    @Override
    public void onClick(View view) {
        Log.i("MS","通过独立类实现点击事件监听");
    }
}

//MainActivity.java
//声明初始化控件View(Button)
    private Button btnTwo;

//通过findViewById的方法查找对应View的id
        btnOne = (Button) findViewById(R.id.btn_two);

//使用独立类实现点击事件监听
        btnTwo.setOnClickListener(new mOnClickListener(){
            @Override
            public void onClick(View view) {
                super.onClick(view);
                Toast.makeText(MainActivity.this, "通过独立类实现点击事件监听", Toast.LENGTH_SHORT).show();
                tvShow.setText("通过独立类实现点击事件监听");
            }
        });

实现结果:

 

实现OnClickListener接口方式

通过接口方式去实现监听事件首先我们要让需要处理的类去实现 OnClickListener 接口,实现这个接口后会让我们去生成 onClick() 方法进行覆写。这个时候业务逻辑实现的地方我们已经找到了,接下来我们来进行对控件view进行绑定的动作。

View的绑定首先是进行控件的声明,然后通过findViewById查找对应view的id,最后实现一个接口的方式实现监听事件(view.setOnClickListener(this))。因为在我们当前类中实现的是一个接口, this 也就是访问当前类的接口的一个对象,这样写完之后就是把当前onClick事件绑定到控件View上面去了。当我们点击View的时候它就会触发当前onClick实现方法。

 

//当前类实现View.OnClickListener
public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    //声明初始化控件View(Button)
    private Button btnThree;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //通过findViewById的方法查找对应View的id
        btnThree= (Button) findViewById(R.id.btn_three);
        //this是访问当前类的接口的一个对象,就是把当前OnClick事件绑定到控件view上面去
        btnThree.setOnClickListener(this);
    }

    //通过接口方式实现事件监听
    @Override
    public void onClick(View view) {
        Toast.makeText(MainActivity.this, "通过接口方式实现事件监听", Toast.LENGTH_SHORT).show();
        tvShow.setText("通过接口方式实现事件监听");
    }
}

实现结果:

 

重写onClick(View view)方式(标签处理)

在XML布局文件的 onClick 标签上绑定需要的方法,属性值为方法名。之后在 java 源文件中编辑该方法,将监听内容写入方法即可。

实现结果:


 

  • 26
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值