来,一起梳理下Android响应点击事件的方法

一、设置setOnClickListener

这应该是最原始的方法了吧,来,先上代码:

布局文件:

 1         <Button
 2             android:id="@+id/button1"
 3             android:layout_width="wrap_content"
 4             android:layout_height="wrap_content"
 5             android:layout_marginLeft="63dp"
 6             android:layout_marginStart="63dp"
 7             android:layout_marginTop="26dp"
 8             android:text="Button1"
 9             app:layout_constraintStart_toStartOf="parent"
10             app:layout_constraintTop_toBottomOf="@id/button" />

Java代码:

1         binding.button1.setOnClickListener(v -> {
2             log("click button1");
3         });

当然,这里使用了MVVM中的DataBinding来查找控件的,你如果乐意,也可以用findViewById,甚至可以用Kotlin中的自动导入控件功能

二、在布局文件中直接写onClick属性

布局文件:

 1         <Button
 2             android:id="@+id/button3"
 3             android:layout_width="wrap_content"
 4             android:layout_height="wrap_content"
 5             android:layout_marginLeft="63dp"
 6             android:layout_marginStart="63dp"
 7             android:layout_marginTop="26dp"
 8             android:onClick="onClickButton3" <!-- 可以看到,这里直接写onClick属性 -->
 9             android:text="Button3"
10             app:layout_constraintStart_toStartOf="parent"
11             app:layout_constraintTop_toBottomOf="@id/button2" />

在Activity中直接实现onClickButton3方法即可:

1     public void onClickButton3(View v) {
2         log("click button 3");
3     }

三、使用MVVM的DataBinding来实现

我们使用MVVM的设计模式,先看布局文件:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <layout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:app="http://schemas.android.com/apk/res-auto"
 4     xmlns:bind="http://schemas.android.com/apk/res-auto"
 5     xmlns:tools="http://schemas.android.com/tools">
 6
 7     <data>
13         <variable
14             name="clickHandler"
15             type="com.plbear.doncal.rxjavademo.MainActivity.ClickHandler" />
16     </data>
17
18     <android.support.constraint.ConstraintLayout
19         android:layout_width="match_parent"
20         android:layout_height="match_parent">
55         <Button
56             android:id="@+id/button2"
57             android:layout_width="wrap_content"
58             android:layout_height="wrap_content"
59             android:layout_marginLeft="63dp"
60             android:layout_marginStart="63dp"
61             android:layout_marginTop="26dp"
62             android:onClick="@{clickHandler.onClickButton2}"
63             android:text="Button2"
64             app:layout_constraintStart_toStartOf="parent"
65             app:layout_constraintTop_toBottomOf="@id/button1" />
88     </android.support.constraint.ConstraintLayout>
89 </layout>

布局文件中onClick直接指向ClickHandler类中的onClickButton2变量,Java中实现该变量即可:

1     public class ClickHandler {
2         public View.OnClickListener onClickButton2 = v -> {
3             log("click button2");
4         };
5     }

四、利用RxView来实现

其实这才是今天要说的重点,先导包:

1     api ‘io.reactivex:rxandroid:1.2.1‘ # 这是个RxJava的包
2     api ‘io.reactivex:rxjava:1.3.0‘ #这个是RxJava的包
3     api ‘io.reactivex.rxjava2:rxandroid:2.1.0‘ #这个是Rxjava2的包,下面用到的CompositeDisposable来自这个包
4     api ‘com.jakewharton.rxbinding2:rxbinding:2.1.1‘ #这个是RxView需要用到的包

布局文件:

 1         <Button
 2             android:id="@+id/button1"
 3             android:layout_width="wrap_content"
 4             android:layout_height="wrap_content"
 5             android:layout_marginLeft="63dp"
 6             android:layout_marginStart="63dp"
 7             android:layout_marginTop="26dp"
 8             android:text="Button1"
 9             app:layout_constraintStart_toStartOf="parent"
10             app:layout_constraintTop_toBottomOf="@id/button" />

Java文件:

先全部贴出来吧:

 1 package com.plbear.doncal.rxjavademo;
 2
 3 import android.databinding.DataBindingUtil;
 4 import android.support.v7.app.AppCompatActivity;
 5 import android.os.Bundle;
 6 import android.util.Log;
 7 import android.view.View;
 8
 9 import com.jakewharton.rxbinding2.view.RxView;
10 import com.plbear.doncal.rxjavademo.databinding.ActivityMainBinding;
11
12 import java.util.concurrent.TimeUnit;
13
14 import io.reactivex.disposables.CompositeDisposable;
15 import io.reactivex.schedulers.Schedulers;
16
17 public class MainActivity extends AppCompatActivity {
18     ActivityMainBinding binding; //自动生成ActivityMainBinding类,命名规则是布局文件使用驼峰规则来命名
19     final User mUser = new User();
20
21     CompositeDisposable compositeDisposable = new CompositeDisposable();
22
23     @Override
24     protected void onCreate(Bundle savedInstanceState) {
25         super.onCreate(savedInstanceState);
26         binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
27         mUser.setName("plbear"); //修改变量
28         mUser.setPasswd("123456");
29         binding.setUser(mUser);//设置layout文件中的user值
30         //binding.setClickHandler(new ClickHandler());//2.设置layout文件中的clickHandler值
31
32         compositeDisposable.add(RxView.clicks(binding.button)
33                 //.(5, TimeUnit.SECONDS)
34                 .throttleFirst(5, TimeUnit.SECONDS)
35                 .observeOn(Schedulers.io())
36                 .subscribe(v -> {
37                     log("click button");
38                 }));
39
40     }
41
42     public void log(String msg) {
43         Log.e(MainActivity.class.getSimpleName(), "yanlog msg:" + msg);
44     }
45
46     @Override
47     protected void onDestroy() {
48         super.onDestroy();
49         compositeDisposable.clear();
50     }
51 }

第一步,先使用CompositeDisposable

有人就要问了,用这个是干啥嘞?

顾名思义,他是一个Disposable的容器类,我们都知道Rxjava是基于观察者模式的,如上述代码,我们通过RxView来建立一个观察者模型(模型??),这个模型只在Activity生命周期内有效,那我们就需要在Activity的onDetory方法中依次调用Disposable的dispose方法,CompositeDisposable就提供了一个容器类,我们每新建一个观察者模型(就叫模型吧。。。),调用CompositeDisposable.add的方法进行添加,在onDestory中直接clear就好了。clear方法会依次对容器内的Desposable实例进行dispose操作。是不是很简单??(简单个??)

第二步,使用RxView来监听click事件:

具体的,看代码就行,这里只强调两个方法:

  • debounce(long timeout, TimeUnit unit),防抖作用,他表示在timeout时间内,如果没有第二次点击,我就把事件抛给观察者,TimeUnit是事件单位
  • throttleFirst(long windowDuration, TimeUnit unit),不好意思,也是防抖作用,他表示我第一次抛出事件后,如果在windowDuration时间内再次产生事件,不好意思,忽略。

看明白上面的区别了吗?没有看明白请把上面的文字再读一遍(哈哈??),反正我建议你用throttleFirst,不要用debounce。

好了,就先这样,如果有别的方式可以响应Android点击事件,可以在评论区留言。

原文地址:https://www.cnblogs.com/yanyojun/p/9783232.html

时间: 2024-10-11 07:50:31

来,一起梳理下Android响应点击事件的方法的相关文章

Android 按钮的响应点击事件的4种写法

Android按钮的响应点击事件 学习了按钮的响应点击事件,写一下总结,写的不好的希望大家能给出意见或建议. 这是layout xml文件   点击事件只需要获得Button的id或者onClick <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" an

设置TextView下划线并响应点击事件(SpannableString)

写Demo程序的时候能表带自定义的数据结构对象吗? --低级程序猿 前情提要:网上介绍TextView+SpannableString的文章真心太长,真心看不懂. ====原文===== 下面是一个20行的完整Demo代码:基本原理是使用一个SpannableString并设置其ClickableSpan来响应点击事件. TextView useInfo = (TextView) findViewById(R.id.info); String url_0_text = "用户协议及隐私条款&qu

[android篇]textview中片段响应点击事件(SpannableString)

项目需求 点击textView中的一小段文字,弹一个dialog框 失败解决方案 刚开始是用了两个textView水平布局,可想而知,当第一个textView快占满一行,还未换行时,第二个textView很可能出现换行排版问题 用spannableString的问题 小段文字有下划线 点击textView中的小段文字时,系统会当做url处理,给点击部分的text加一个蓝色的背景 解决方案 public class TouchableSpan extends ClickableSpan { pri

TextView下划线,部分文字并响应点击事件(SpannableString)

TextView useInfo = (TextView) findViewById(R.id.info); useInfo.setText("开始即表示您同意遵守"); String url_0_text = "用户协议及隐私条款"; SpannableString spStr = new SpannableString(url_0_text); spStr.setSpan(new ClickableSpan() { @Override public void u

归纳总结Android的点击事件

地址 http://blog.csdn.net/xiangyong_1521/article/details/78489254 目录 常见按钮点击 点击的其他方式 对话框按钮点击 列表点击 物理键点击 附 1. 常见按钮点击 a.单击事件,主要用于Button和ImageButton控件,布局视图与TextView.ImageView控件用的也比较多.相关类名与方法说明如下: 监听器类名 : View.OnClickListener 设置监听器的方法 : setOnClickListener 监

Android笔记---点击事件的四种写法

Android 点击事件的四种写法: 1. 以内部类的形式实现 OnClickListener 接口.定义点击事件 class MainActivity extents Activity{ // ... private class MyListener implements OnClickListener{ public void Onclick(View v){ // ... 点击事件的响应 } } } 2. 採用匿名内部类 ? ?缺点:若是点击事件太多,则须要的匿名内部类太多 class M

无法响应点击事件listview.OnItemClickListener 11_13

无法响应点击事件OnItemClickListener android:descendantFocusability="blocksDescendants"即可.这样Item Layout就屏蔽了所有子控件获取Focus的权限, beforeDescendants:viewgroup会优先其子类控件而获取到焦点 afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点 blocksDescendants:viewgroup会覆盖子类控件而直接获得焦

android HOME点击事件的获取

 首先声明我是做系统开发的(高通平台),所以下面介绍的方法并不适合应用开发者. 最经有个需求要屏蔽HOME按键返回桌面并且实现自己的功能,发现以前的方式报错用不了,上网搜索了一下,发现都是抄来抄去基本是无用的.网上的方法不外乎这几种: 第一, 大家最常用的重写onAttachedToWindow()方法,然后在HOME点击事件KeyEvent.KEYCODE_HOME中做自己想做的事情,但是这个方法google处于安全考虑在android2.3.3之后就不支持了. 第二, 抓取系统log日志,判

android 按钮点击事件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBo