一, 设置 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 的设计模式, 先看布局文件:
- 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 中实现该变量即可:
- 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 操作. 是不是很简单??(简单个??)
第二步, 使用 RxView 来监听 click 事件:
具体的, 看代码就行, 这里只强调两个方法:
debounce(long timeout, TimeUnit unit), 防抖作用, 他表示在 timeout 时间内, 如果没有第二次点击, 我就把事件抛给观察者, TimeUnit 是事件单位
throttleFirst(long windowDuration, TimeUnit unit), 不好意思, 也是防抖作用, 他表示我第一次抛出事件后, 如果在 windowDuration 时间内再次产生事件, 不好意思, 忽略.
看明白上面的区别了吗? 没有看明白请把上面的文字再读一遍 (哈哈??), 反正我建议你用 throttleFirst, 不要用 debounce.
好了, 就先这样, 如果有别的方式可以响应 Android 点击事件, 可以在评论区留言.
来源: http://www.bubuko.com/infodetail-2805774.html