Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱
MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina.com

RxJava RxBinding RxView 控件事件 MD

demo地址

GitHub


目录

简介

按需添加相应的依赖:

  1. implementation 'com.jakewharton.rxbinding2:rxbinding:2.1.1'
  2. implementation 'com.jakewharton.rxbinding2:rxbinding-support-v4:2.1.1'
  3. implementation 'com.jakewharton.rxbinding2:rxbinding-appcompat-v7:2.1.1'
  4. implementation 'com.jakewharton.rxbinding2:rxbinding-design:2.1.1'
  5. implementation 'com.jakewharton.rxbinding2:rxbinding-recyclerview-v7:2.1.1'
  6. implementation 'com.jakewharton.rxbinding2:rxbinding-leanback-v17:2.1.1'

通过将【-kotlin】附加到依赖项的'artifactId'后,可以获得所有上述库的 Kotlin 扩展方法。例如:

  1. implementation 'com.jakewharton.rxbinding2:rxbinding-kotlin:2.1.1'
  2. implementation 'com.jakewharton.rxbinding2:rxbinding-support-v4-kotlin:2.1.1'

特点

  • 可以对 View 事件使用 RxJava 的各种操作
  • 提供了与 RxJava 一致的回调,使得代码简洁明了。尤其是页面中充斥着大量的监听事件,各种各样的匿名内部类时
  • 几乎支持我们常用的所有控件及事件,每个库还有对应的Kotlin支持库





使用案例

  1. public class RxBindingActivity extends RxFragmentActivity {
  2. private static final String[] ARRAY = {"包青天", "白乾涛", "baiqiantao", "bqt", "RxBinding", "RxView", "1", "2", "3", "4", "5",};
  3. private ImageView iv1, iv2, iv3, iv4, iv5;
  4. private EditText et1, et2, et3;
  5. private Button btn;
  6. private CheckBox cb;
  7. private ListView listView;
  8. private int type;
  9. @Override
  10. protected void onCreate(@Nullable Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.activity_rxbinding);
  13. iv1 = findViewById(R.id.iv1);
  14. iv2 = findViewById(R.id.iv2);
  15. iv3 = findViewById(R.id.iv3);
  16. iv4 = findViewById(R.id.iv4);
  17. iv5 = findViewById(R.id.iv5);
  18. btn = findViewById(R.id.btn);
  19. et1 = findViewById(R.id.et1);
  20. et2 = findViewById(R.id.et2);
  21. et3 = findViewById(R.id.et3);
  22. cb = findViewById(R.id.cb);
  23. listView = findViewById(R.id.lv);
  24. listView.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, Arrays.asList(ARRAY)));
  25. type = getIntent().getIntExtra("type", 0);
  26. log("type=" + type);
  27. switch (type) {
  28. case 0:
  29. event();
  30. break;
  31. case 1:
  32. accept();
  33. break;
  34. case 2:
  35. usefulDemo();
  36. break;
  37. }
  38. }
  39. @Override
  40. protected void onResume() {
  41. super.onResume();
  42. if (type == 3) {
  43. bufferDemo();
  44. }
  45. }
  46. @SuppressLint("NewApi")
  47. private void event() {
  48. RxView.attaches(iv1).subscribe(o -> log("attach event"));
  49. RxView.attachEvents(iv1).subscribe(viewAttachEvent -> log("attach event"));
  50. RxView.clicks(iv1).subscribe(o -> log("click event")); //setOnClickListener
  51. RxView.detaches(iv1).subscribe(o -> log("detach event"));
  52. RxView.drags(listView).subscribe(dragEvent -> log("drag event:" + dragEvent.getAction())); //setOnDragListener
  53. RxView.draws(listView).subscribe(o -> log("draw event")); // ViewTreeObserver#addOnDrawListener
  54. RxView.focusChanges(iv1).subscribe(hasFocus -> log("focus change event:" + hasFocus)); //setOnFocusChangeListener
  55. RxView.globalLayouts(listView).subscribe(o -> log("global event")); //ViewTreeObserver#addOnGlobalLayoutListener
  56. RxView.hovers(iv1).subscribe(motionEvent -> log("hover event:" + motionEvent.getAction())); //setOnHoverListene,悬停事件
  57. RxView.keys(iv1).subscribe(keyEvent -> log("key event:" + keyEvent.getAction())); //setOnKeyListener
  58. RxView.layoutChanges(listView).subscribe(o -> log("layout event")); //addOnLayoutChangeListener
  59. RxView.layoutChangeEvents(listView).subscribe(viewLayoutChangeEvent -> log("layout event"));//addOnLayoutChangeListener
  60. RxView.longClicks(iv1).subscribe(o -> log("long click event")); //setOnLongClickListener
  61. RxView.scrollChangeEvents(listView).subscribe(viewScrollChangeEvent -> log("scroll event")); //setOnScrollChangeListener
  62. RxView.systemUiVisibilityChanges(listView).subscribe(vii -> log("visible event" + vii)); //setOnSystemUiVisibilityChangeListener
  63. RxView.touches(listView).subscribe(motionEvent -> { //setOnTouchListener
  64. log("touch event:" + motionEvent.getAction());
  65. listView.onTouchEvent(motionEvent);//如果不传给listView,则listView将不能获取到Touch事件,那么listView会出现不能滑动等问题
  66. });
  67. RxAdapterView.itemClicks(listView).subscribe(position -> log("item click event:" + position)); //setOnItemClickListener
  68. RxAdapterView.itemClickEvents(listView).subscribe(adapterViewItemClickEvent -> log("item click event")); //点击
  69. RxAdapterView.itemLongClicks(listView).subscribe(position -> log("item long click event:" + position)); //setOnItemLongClickListener
  70. RxAdapterView.itemLongClickEvents(listView).subscribe(adapterViewItemLongClickEvent -> log("item long click event")); //长点击
  71. RxAdapterView.itemSelections(listView).subscribe(position -> log("item select event:" + position)); //setOnItemSelectedListener
  72. RxAdapterView.selectionEvents(listView).subscribe(adapterViewSelectionEvent -> log("item select event")); //选择
  73. RxAdapter.dataChanges(listView.getAdapter()).subscribe(listAdapter -> log("data change event"));//registerDataSetObserver
  74. RxAbsListView.scrollEvents(listView).subscribe(absListViewScrollEvent -> log("scroll event")); //setOnScrollListener
  75. RxViewGroup.changeEvents(listView).subscribe(viewGroupHierarchyChangeEvent -> log("哈"));//setOnHierarchyChangeListener
  76. RxCompoundButton.checkedChanges(cb).subscribe(isChecked -> log("check event:" + isChecked)); //setOnCheckedChangeListener
  77. RxTextView.textChanges(et1).subscribe(cs -> log("text change event:" + cs.toString())); //addTextChangedListener
  78. RxTextView.textChangeEvents(et2).subscribe(textViewTextChangeEvent -> log("text change event")); //addTextChangedListener
  79. RxTextView.afterTextChangeEvents(et3).subscribe(textViewAfterTextChangeEvent -> log("aftet text change event"));
  80. RxTextView.beforeTextChangeEvents(et3).subscribe(textViewBeforeTextChangeEvent -> log("before text change event"));
  81. RxTextView.editorActions(et1).subscribe(actionId -> log("editor event:" + actionId)); //setOnEditorActionListener,需要设置inputType
  82. RxTextView.editorActionEvents(et2).subscribe(textViewEditorActionEvent -> log("editor event")); //点击软键盘上的回车键
  83. }
  84. private void accept() {
  85. try {
  86. RxView.visibility(iv1).accept(false);//view.setVisibility(value ? View.VISIBLE : View.GONE)
  87. RxView.visibility(iv2, View.GONE).accept(true);//view.setVisibility(value ? View.VISIBLE : visibilityWhenFalse)
  88. RxView.visibility(iv3, View.GONE).accept(false);
  89. RxView.visibility(iv4, View.INVISIBLE).accept(false);
  90. RxView.visibility(iv5, View.INVISIBLE).accept(true);
  91. RxAdapterView.selection(listView).accept(1); //view.setSelection(position)
  92. RxCompoundButton.checked(cb).accept(true); //view.setChecked(value)
  93. RxCompoundButton.toggle(cb).accept(null); //view.toggle(),切换状态
  94. RxTextView.color(et1).accept(Color.RED); //view.setTextColor(color)
  95. RxTextView.textRes(et1).accept(R.string.app_name); //view.setText(int resId)
  96. RxTextView.hintRes(et2).accept(R.string.app_name); //view.setHint(int resId)
  97. RxTextView.errorRes(et3).accept(R.string.app_name); //view.setError(int resId)
  98. RxTextView.text(et1).accept("text"); //view.setText(String text)
  99. RxTextView.hint(et2).accept("hint"); //view.setHint(String text)
  100. RxTextView.error(et3).accept("error"); //view.setError(String text)
  101. } catch (Exception e) {
  102. e.printStackTrace();
  103. }
  104. }
  105. private void usefulDemo() {
  106. RxView.clicks(iv1)
  107. .throttleFirst(2, TimeUnit.SECONDS) //throttleFirst只响应第一次,throttleLast只响应最后一次
  108. .subscribe(o -> log("防抖动"));
  109. RxView.clicks(iv2)
  110. .compose(new RxPermissions(this).ensure(Manifest.permission.CAMERA)) //动态获取权限
  111. .subscribe(granted -> log(granted ? "已赋予权限" : "已拒绝权限"));
  112. RxTextView.textChanges(et1)
  113. .debounce(500, TimeUnit.MILLISECONDS) //防抖动,控件操作时间间隔,去除发送频率过快的项
  114. .subscribe(charSequence -> log(charSequence.toString()));
  115. Observable<CharSequence> observable1 = RxTextView.textChanges(et2).skip(1);
  116. Observable<CharSequence> observable2 = RxTextView.textChanges(et3).skip(1);
  117. Observable.combineLatest(observable1, observable2, //合并监听、表单验证
  118. (phone, password) -> {
  119. log(phone + "_" + password);
  120. return phone.toString().startsWith("1") && password.toString().endsWith("1");
  121. }).subscribe(isValid -> btn.setEnabled(isValid));
  122. RxView.clicks(btn) //发送验证码功能
  123. .doOnNext(o -> btn.setEnabled(false))
  124. .subscribe(o -> Observable.interval(1, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
  125. .take(10)
  126. .compose(bindToLifecycle())
  127. .map(aLong -> 10 - aLong + " 秒后重新获取")
  128. .subscribe(string -> btn.setText(string),
  129. Throwable::printStackTrace,
  130. () -> {
  131. btn.setEnabled(true);
  132. btn.setText("重新获取");
  133. }));
  134. }
  135. private void bufferDemo() {
  136. RxView.clicks(iv1)
  137. .buffer(1000, TimeUnit.MILLISECONDS, 5) //效果仅仅是,每隔1秒钟收集一下此1秒钟内的点击次数
  138. .compose(bindUntilEvent(ActivityEvent.STOP))//在 onStop 时取消
  139. .subscribe(list -> Log.i("【bqt】", "iv1一秒钟内的点击次数:" + list.size()));
  140. RxView.clicks(iv2)
  141. .map(obj -> 1) //和上面的情况基本一致
  142. .buffer(1000, TimeUnit.MILLISECONDS)
  143. .compose(bindUntilEvent(ActivityEvent.STOP))
  144. .subscribe(list -> Log.i("【bqt】", "iv2一秒钟内的点击次数:" + list.size()));
  145. //这种效果可能不是你想要的效果,你想要的效果可能是:在1秒钟内点击次数为多少次就是几次连击
  146. Observable<Object> observable = RxView.clicks(iv3).share();
  147. observable.buffer(observable.debounce(200, TimeUnit.MILLISECONDS).compose(bindUntilEvent(ActivityEvent.STOP)))
  148. .subscribe(list -> Log.i("【bqt】", "iv3连续点击次数:" + list.size()));//这里的时间指的是任意两次点击最长间隔时间);
  149. }
  150. private void log(String s) {
  151. Log.i("【bqt】", s);
  152. }
  153. }

布局

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">
  6. <LinearLayout
  7. android:layout_width="match_parent"
  8. android:layout_height="50dp"
  9. android:orientation="horizontal">
  10. <ImageView
  11. android:id="@+id/iv1"
  12. android:layout_width="50dp"
  13. android:layout_height="match_parent"
  14. android:src="@drawable/icon"/>
  15. <ImageView
  16. android:id="@+id/iv2"
  17. android:layout_width="50dp"
  18. android:layout_height="match_parent"
  19. android:layout_marginLeft="20dp"
  20. android:background="#f00"/>
  21. <ImageView
  22. android:id="@+id/iv3"
  23. android:layout_width="50dp"
  24. android:layout_height="match_parent"
  25. android:layout_marginLeft="20dp"
  26. android:background="#0f0"/>
  27. <ImageView
  28. android:id="@+id/iv4"
  29. android:layout_width="50dp"
  30. android:layout_height="match_parent"
  31. android:layout_marginLeft="20dp"
  32. android:background="#00f"/>
  33. <ImageView
  34. android:id="@+id/iv5"
  35. android:layout_width="50dp"
  36. android:layout_height="match_parent"
  37. android:layout_marginLeft="20dp"
  38. android:background="#000"/>
  39. </LinearLayout>
  40. <LinearLayout
  41. android:layout_width="match_parent"
  42. android:layout_height="50dp"
  43. android:orientation="horizontal">
  44. <EditText
  45. android:id="@+id/et1"
  46. android:layout_width="0dp"
  47. android:layout_height="match_parent"
  48. android:layout_weight="1"
  49. android:hint="et1"
  50. android:inputType="text"/>
  51. <EditText
  52. android:id="@+id/et2"
  53. android:layout_width="0dp"
  54. android:layout_height="match_parent"
  55. android:layout_weight="1"
  56. android:hint="et2"
  57. android:imeOptions="actionDone"
  58. android:inputType="phone"/>
  59. <EditText
  60. android:id="@+id/et3"
  61. android:layout_width="0dp"
  62. android:layout_height="match_parent"
  63. android:layout_weight="1"
  64. android:hint="et3"
  65. android:imeOptions="actionSearch"
  66. android:inputType="textPassword"/>
  67. </LinearLayout>
  68. <Button
  69. android:id="@+id/btn"
  70. android:layout_width="wrap_content"
  71. android:layout_height="wrap_content"
  72. android:text="点击获取验证码"
  73. android:textSize="12sp"/>
  74. <CheckBox
  75. android:id="@+id/cb"
  76. android:layout_width="wrap_content"
  77. android:layout_height="wrap_content"
  78. android:background="#300f"
  79. android:checked="true"
  80. android:text="已阅读并同意用户协议"/>
  81. <ListView
  82. android:id="@+id/lv"
  83. android:layout_width="match_parent"
  84. android:layout_height="wrap_content"/>
  85. </LinearLayout>

2018-9-15

RxJava RxBinding RxView 控件事件 MD的更多相关文章

  1. (转)客户端触发Asp.net中服务端控件事件

    第一章. Asp.net中服务端控件事件是如何触发的 Asp.net 中在客户端触发服务端事件分为两种情况: 一. WebControls中的Button 和HtmlControls中的Type为su ...

  2. MFC 设置控件事件对应的函数

    在项目中,右击你想设置的控件,打开属性. 然后找到:控件事件,如果在Visual Studio 2015中操作,显示如图: 然后,以设定单击事件为例: 点击右边的三角,选择 <Edit Code ...

  3. Python pyQt4/pyQt5 学习笔记1(空白窗口,按钮,控件事件,控件提示,窗体显示到屏幕中间,messagebox)

    PyQt4是用来编写有图形界面程序(GUI applications)的一个工具包.PyQt4作为一个Python模块来使用,它有440个类和超过6000种函数和方法.同时它也是一个可以在几乎所有主流 ...

  4. JQuery 点击子控件事件,不会触发父控件的事件

     $('.order-delete').on('tap', function (e) {                  console.log('删除1');                  c ...

  5. Android开发之解决父控件拦截子控件事件问题

    以ViewPager为例: public class TopNewsViewPager extends ViewPager { public TopNewsViewPager(Context cont ...

  6. .net控件事件中的Sender

    private void button2_Click(object sender, RoutedEventArgs e) { } 最近看WPF内容,回顾下.net大家天天都在用,却不是十分关注的一个对 ...

  7. ASP.NET用户控件事件的定义和实践

    假定用户控件(UserControl.ascx)中包含按钮控件  AButton,希望实现按  Button  按钮时,包含该用户控件的页面可以接收到事件. UserControl.ascx.cs   ...

  8. webbrowser控件事件

    Beforenavigate2: Fired before navigate occurs in the given WebBrowser(window or frameset element). T ...

  9. 转:HTML 5 控件事件属性

    Window 事件属性 window 对象触发的事件. 适用于 <body> 标签: 属性 值 描述 onafterprint script 在打印文档之后运行脚本 onbeforepri ...

随机推荐

  1. SQL语句之 数据约束

    SQL语句之 数据约束 什么是数据约束 数据约束用来限制用户对数据的非法的修改操作. 1.约束字段的默认值 如果插入记录时,没有给某个字段赋值,那么我们可以设置它的默认值 关键字:default CR ...

  2. SPFA算法 O(kE)

    主要思想是:     初始时将起点加入队列.每次从队列中取出一个元素,并对所有与它相邻的点进行修改,若某个相邻的点修改成功,则将其入队.直到队列为空时算法结束.     这个算法,简单的说就是队列优化 ...

  3. P4745 B’s problem(b)

    P4745 B’s problem(b) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 NOIP春季系列课程 描述 题目描述 小B生活在一个很奇怪的国家里, ...

  4. NCTF2018 Easy_Audit的writeup

    题目直接给出来代码 这题考几个点: 1.$_REQUEST的变量覆盖 2.编码绕过 3.PHP数组特性 4.正则绕过 5.file_get_contents函数 首先一步步把题目分析一遍 if($_R ...

  5. 深刻领悟javascript中的exec与match方法之异同

    阅读本文之前,请先看下面一道题: 题目17:Read the following javascript code:  var someText="web2.0 .net2.0"; ...

  6. java自动给版本升级,遇9变0且前面一个版本加1

    /** * 自动升级版本号,版本号+1 * @param version * @return */ private String autoUpgradeVersion(String version){ ...

  7. request.getRequestDispatcher("").forward()中文乱码

    即使jsp页面的编码已设为“UTF-8”,有中文的地方还是会出现乱码,但是用response.sendRedirect不会出现此问题. 解决方案一: 不使用PrintWriter out=respon ...

  8. C# 读带复选框的excel,写excel并设置字体、边框、背景色

    这是一篇excel读写功能大汇总,通过C#调用Microsoft.Office.Interop.Excel.dll才能完成任何复杂格式excel的读写操作. 本文需要读取的excel格式如下: 可见表 ...

  9. 利用dynamic简化数据库的访问

    今天写了一个数据库的帮助类,代码如下. public static class DbEx { public static dynamic ReadToObject(this IDataReader r ...

  10. jPlayer插件的使用

    文讲一下本人在使用jPlayer插件时的整个过程.出现的BUG已经解决办法. 最近在做bootstrap项目,项目中需要一个响应式.兼容IE7的视频播放插件,经过上网查找,找到了所谓可以兼容到IE6的 ...