来,一起梳理下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 ...
随机推荐
- POJ3579 Median —— 二分
题目链接:http://poj.org/problem?id=3579 Median Time Limit: 1000MS Memory Limit: 65536K Total Submissio ...
- poj 1274 The Perfect Stall 解题报告
题目链接:http://poj.org/problem?id=1274 题目意思:有 n 头牛,m个stall,每头牛有它钟爱的一些stall,也就是几头牛有可能会钟爱同一个stall,问牛与 sta ...
- CocoaPods 安装相关问题
(1)pod install还是pod update都卡在Analyzing dependencies不动. 解决方法: 其实原因在于以上两个命令执行时会升级CocoaPods的spec仓库,加一个参 ...
- ng2中文文档地址
https://angular.cn/docs/ts/latest/guide/displaying-data.html
- DLL远程注入实例
一般情况下,每个进程都有自己的私有空间,理论上,别的进程是不允许对这个私人空间进行操作的,但是,我们可以利用一些方法进入这个空间并进行操作,将自己的代码写入正在运行的进程中,于是就有了远程注入了. 对 ...
- 【转】git修改文件后,提交到远程仓库
原文地址:https://blog.csdn.net/nly19900820/article/details/73613654 修改文件后,怎么提交到远程仓库1.git status 查看git是否有 ...
- list转json的一些问题
利用JSONArray转换list 定义的model: package com.yds.model; import java.util.Date; public class DeviceHistory ...
- 【华为2016上机试题C++】最高分是多少
[编程题] 最高分是多少 时间限制:1秒 空间限制:65536K 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. 输入描述: 输入包括 ...
- Swift异常处理的try?与try!
首先要明白抛出异常后异常的运动:异常被抛出后,中断整个处理,异常不断向外层(范围)传递,直到遇到catch代码块群,会与catch代码块的条件进行匹配,匹配符合则进入此代码块处理.如果遇到没有条件的c ...
- springboot redis工具类
package com.vv.boot.util; import java.util.List; import java.util.Map; import java.util.Set; import ...