android读取gxt文件,来,一起梳理下Android响应点击事件的方法

一、设置setOnClickListener

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

布局文件:

1

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

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"

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

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

13

15 type="com.plbear.doncal.rxjavademo.MainActivity.ClickHandler" />

16

17

18

20 android:layout_height="match_parent">

55

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

89

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

1 public classClickHandler {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

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 packagecom.plbear.doncal.rxjavademo;2

3 importandroid.databinding.DataBindingUtil;4 importandroid.support.v7.app.AppCompatActivity;5 importandroid.os.Bundle;6 importandroid.util.Log;7 importandroid.view.View;8

9 importcom.jakewharton.rxbinding2.view.RxView;10 importcom.plbear.doncal.rxjavademo.databinding.ActivityMainBinding;11

12 importjava.util.concurrent.TimeUnit;13

14 importio.reactivex.disposables.CompositeDisposable;15 importio.reactivex.schedulers.Schedulers;16

17 public class MainActivity extendsAppCompatActivity {18 ActivityMainBinding binding; //自动生成ActivityMainBinding类,命名规则是布局文件使用驼峰规则来命名

19 final User mUser = newUser();20

21 CompositeDisposable compositeDisposable = newCompositeDisposable();22

23 @Override24 protected voidonCreate(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 voidlog(String msg) {43 Log.e(MainActivity.class.getSimpleName(), "yanlog msg:" +msg);44 }45

46 @Override47 protected voidonDestroy() {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点击事件,可以在评论区留言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值