来,一起梳理下Android响应点击事件的方法
一、设置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响应点击事件的方法的更多相关文章
- iOS -实现imageView中的button响应点击事件的方法
<pre name="code" class="cpp" style="font-size: 13px;">/** imagev ...
- 设置TextView下划线并响应点击事件(SpannableString)
下面是一个20行的完整Demo代码:基本原理是使用一个SpannableString并设置其ClickableSpan来响应点击事件. TextView useInfo = (TextView) fi ...
- TextView下划线,部分文字并响应点击事件(SpannableString)
TextView useInfo = (TextView) findViewById(R.id.info); useInfo.setText("开始即表示您同意遵守"); Stri ...
- Android journey3 @点击事件的4种写法
对于android布局中的控件,如Button等会有相应的点击事件去响应它所需要的功能,今天我们就以电话拨号器的代码说明下几种点击事件: package com.itheima.phone; impo ...
- Android笔记---点击事件的四种写法
Android 点击事件的四种写法: 1. 以内部类的形式实现 OnClickListener 接口.定义点击事件 class MainActivity extents Activity{ // .. ...
- c# 给button添加不规则的图片以及用pictureBox替代button响应点击事件
1.Flat button 用这个方法,前提是要把button的type设置为Flat button1.TabStop = false;button1.FlatAppearance.BorderSiz ...
- UIButton无法响应点击事件
一.问题描述 因为项目需要,需要UITableView上添加固定的筛选表头,一直固定,不能随UITableView滚动.所以直接将表头与UITableView分离,将它添加到控制器的UIView上,即 ...
- 隐藏自定义的tabbar之后,push到B视图,B视图的键盘工具条无法响应点击事件
我的情况如下: 在TabbarViewController中隐藏了系统的tabbar,然后自定义tabbar,A B C D 4个视图都有UINavigationController,A视图 使用的是 ...
- IOS7 UITableView一行滑动删除后 被删除行的下一行的点击事件将被忽略解决办法
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSI ...
随机推荐
- easyUI-右键菜单,关闭选项卡
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- contents属性
CALayer 有一个属性叫做contents,这个属性的类型被定义为id,意味着它可以是任何类型的对象.在这种情况下,你可以给contents属性赋任何值,你的app仍然能够编译通过.但是,在实践中 ...
- hdu 2594 Simpsons’ Hidden Talents(两个串的next数组)
题意:两个字符串s.t,求s和t的最长的相同的前缀和后缀 思路:先求s的next数组,再求t的next数组(即代码中ex数组,此时不是自己与自己匹配,而是与s匹配),最后看ex[len2]即可(len ...
- hadoop datanode启动失败(All directories in dfs.data.dir are invalid)
由于hadoop节点的磁盘满了,导致节点死掉,今天对其进行扩容.首先,将原节点的数据拷贝到目标节点下,从而避免数据的丢失,但是在执行hadoop_daemon.sh start datanode后没有 ...
- hdu-2680 Choose the best route(最短路)
题目链接: Choose the best route Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- python-dev 安装错误
/******************************************************************** * python-dev 安装错误 * 说明: * 今天在安 ...
- Healthy Holsteins
链接 分析:因为数据范围比较小,我们可以通过二进制枚举子集,然后找出所需饲料种数最小的并记录下来,同时记录一下路径,也就是字典序最小的 /* PROB:holstein ID:wanghan LANG ...
- 出现"Unable to instantiate Action,xxxxx, defined for 'login' in namespace '/' xxxxx 解决办法
转自:https://blog.csdn.net/heroful/article/details/17261169 问题原因: 在MyEclipse 利用SSH框架写程序,运行时出现 " U ...
- CodeForces 1103C. Johnny Solving
题目简述:给定简单(无自环.无重边)连通无向图$G = (V, E), 1 \leq n = |V| \leq 2.5 \times 10^5, 1 \leq m = |E| \leq 5 \time ...
- Python学习之旅—生成器对象的send方法详解
前言 在上一篇博客中,笔者带大家一起探讨了生成器与迭代器的本质原理和使用,本次博客将重点聚焦于生成器对象的send方法. 一.send方法详解 我们知道生成器对象本质上是一个迭代器.但是它比迭代器对 ...