一、设置setOnClickListener

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

布局文件:

         <Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="63dp"
android:layout_marginStart="63dp"
android:layout_marginTop="26dp"
android:text="Button1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/button" />

Java代码:

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

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

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

布局文件:

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

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

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

三、使用MVVM的DataBinding来实现

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

 <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:bind="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"> <data>
<variable
name="clickHandler"
type="com.plbear.doncal.rxjavademo.MainActivity.ClickHandler" />
</data> <android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="63dp"
android:layout_marginStart="63dp"
android:layout_marginTop="26dp"
android:onClick="@{clickHandler.onClickButton2}"
android:text="Button2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/button1" />
</android.support.constraint.ConstraintLayout>
</layout>

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

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

四、利用RxView来实现

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

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

布局文件:

         <Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="63dp"
android:layout_marginStart="63dp"
android:layout_marginTop="26dp"
android:text="Button1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/button" />

Java文件:

先全部贴出来吧:

 package com.plbear.doncal.rxjavademo;

 import android.databinding.DataBindingUtil;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View; import com.jakewharton.rxbinding2.view.RxView;
import com.plbear.doncal.rxjavademo.databinding.ActivityMainBinding; import java.util.concurrent.TimeUnit; import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.schedulers.Schedulers; public class MainActivity extends AppCompatActivity {
ActivityMainBinding binding; //自动生成ActivityMainBinding类,命名规则是布局文件使用驼峰规则来命名
final User mUser = new User(); CompositeDisposable compositeDisposable = new CompositeDisposable(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
mUser.setName("plbear"); //修改变量
mUser.setPasswd("123456");
binding.setUser(mUser);//设置layout文件中的user值
//binding.setClickHandler(new ClickHandler());//2.设置layout文件中的clickHandler值 compositeDisposable.add(RxView.clicks(binding.button)
//.(5, TimeUnit.SECONDS)
.throttleFirst(5, TimeUnit.SECONDS)
.observeOn(Schedulers.io())
.subscribe(v -> {
log("click button");
})); } public void log(String msg) {
Log.e(MainActivity.class.getSimpleName(), "yanlog msg:" + msg);
} @Override
protected void onDestroy() {
super.onDestroy();
compositeDisposable.clear();
}
}

第一步,先使用CompositeDisposable

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

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

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

  1. iOS -实现imageView中的button响应点击事件的方法

    <pre name="code" class="cpp" style="font-size: 13px;">/** imagev ...

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

    下面是一个20行的完整Demo代码:基本原理是使用一个SpannableString并设置其ClickableSpan来响应点击事件. TextView useInfo = (TextView) fi ...

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

    TextView useInfo = (TextView) findViewById(R.id.info); useInfo.setText("开始即表示您同意遵守"); Stri ...

  4. Android journey3 @点击事件的4种写法

    对于android布局中的控件,如Button等会有相应的点击事件去响应它所需要的功能,今天我们就以电话拨号器的代码说明下几种点击事件: package com.itheima.phone; impo ...

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

    Android 点击事件的四种写法: 1. 以内部类的形式实现 OnClickListener 接口.定义点击事件 class MainActivity extents Activity{ // .. ...

  6. c# 给button添加不规则的图片以及用pictureBox替代button响应点击事件

    1.Flat button 用这个方法,前提是要把button的type设置为Flat button1.TabStop = false;button1.FlatAppearance.BorderSiz ...

  7. UIButton无法响应点击事件

    一.问题描述 因为项目需要,需要UITableView上添加固定的筛选表头,一直固定,不能随UITableView滚动.所以直接将表头与UITableView分离,将它添加到控制器的UIView上,即 ...

  8. 隐藏自定义的tabbar之后,push到B视图,B视图的键盘工具条无法响应点击事件

    我的情况如下: 在TabbarViewController中隐藏了系统的tabbar,然后自定义tabbar,A B C D 4个视图都有UINavigationController,A视图 使用的是 ...

  9. IOS7 UITableView一行滑动删除后 被删除行的下一行的点击事件将被忽略解决办法

    - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSI ...

随机推荐

  1. ZOJ3469 Food Delivery —— 区间DP

    题目链接:https://vjudge.net/problem/ZOJ-3469 Food Delivery Time Limit: 2 Seconds      Memory Limit: 6553 ...

  2. java 连接飞信API

    通过java连接飞信api给自己的好友(包括自己)发送飞信内容.如果对方的手机号非你的飞信好友则不能发送.​​1. [代码]飞信发送类     package per.artisan.fetion; ...

  3. CodeForces979D:Kuro and GCD and XOR and SUM(Trie树&指针&Xor)

    Kuro is currently playing an educational game about numbers. The game focuses on the greatest common ...

  4. SPOJ_705_New Distinct Substrings_后缀数组

    SPOJ_705_New Distinct Substrings_后缀数组 题意: 给定一个字符串,求该字符串含有的本质不同的子串数量. 后缀数组的一个小应用. 考虑每个后缀的贡献,如果不要求本质不同 ...

  5. 【总结——HTTP协议】

    一.HTTP协议简介 什么是HTTP?全称是HyperText Transfer Protocal,即:超文本传输协议,从1990年开始就在WWW上广泛应用,是现今在WWW上应用最多的协议,目前版本是 ...

  6. PostgreSQL新手教程

    自从MySQL被Oracle收购以后,PostgreSQL逐渐成为开源关系型数据库的首选. 本文介绍PostgreSQL的安装和基本用法,供初次使用者上手.以下内容基于Debian操作系统,其他操作系 ...

  7. 任务37:生成 JWT Token

    实现给用户办法token 默认是可以访问valuesController的,返回的状态是200 http://localhost:5429/api/values 返回的状态码是200 把ValuesC ...

  8. (水题)洛谷 - P1464 - Function

    https://www.luogu.org/problemnew/show/P1464 #include<bits/stdc++.h> using namespace std; #defi ...

  9. Thrift 原理与使用实例

    一.Thrift 框架介绍 1.前言 Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目.Thrift通过一个中间语言(IDL, 接口定 ...

  10. P5154 数列游戏(区间dp)

    传送门 果然和dp有关的东西我绝对做不出来啊-- 设\(dp[i][j]\)表示消完区间\([i,j]\)中的数之后能得到的最大分数,如果消不完则为\(-inf\),否则枚举断点.顺便如果\(a[i] ...