课题

  1. 程序界面由3个文本编辑框和1个文本标签组成。
  2. 要求文本标签实时显示3个文本编辑框所输入的数字之和。
  3. 文本编辑框输入的不是合法数字时,将其值视为0。
  4. 3个文本编辑框的初值分别为1,2,3。

创建工程

打开 Android Studio,File / New / Project...

在 New Project 向导的第1页,Application Name 填上 RxExample,选 Include Kotlin support。

在向导的第4页点击 Finish 按钮创建工程

build.gradle 内容如下

  1. apply plugin: 'com.android.application'
  2. apply plugin: 'kotlin-android'
  3. apply plugin: 'kotlin-android-extensions'
  4. android {
  5. compileSdkVersion 28
  6. defaultConfig {
  7. applicationId "com.zwstudio.rxexample"
  8. minSdkVersion 15
  9. targetSdkVersion 28
  10. versionCode 1
  11. versionName "1.0"
  12. testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
  13. }
  14. buildTypes {
  15. release {
  16. minifyEnabled false
  17. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  18. }
  19. }
  20. }
  21. dependencies {
  22. implementation fileTree(dir: 'libs', include: ['*.jar'])
  23. implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
  24. implementation 'com.android.support:appcompat-v7:28.0.0-rc01'
  25. implementation 'com.android.support.constraint:constraint-layout:1.1.2'
  26. testImplementation 'junit:junit:4.12'
  27. androidTestImplementation 'com.android.support.test:runner:1.0.2'
  28. androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
  29. }

在 android 部分加上 buildToolsVersion

  1. android {
  2. compileSdkVersion 28
  3. buildToolsVersion '28.0.2'
  4. // ...
  5. }

在 dependencies 部分加上对4个包的引用

RxAndroid, RxJava, RxKotlin, RxBinding

  1. dependencies {
  2. // ...
  3. implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
  4. implementation 'io.reactivex.rxjava2:rxjava:2.1.16'
  5. implementation 'io.reactivex.rxjava2:rxkotlin:2.2.0'
  6. implementation 'com.jakewharton.rxbinding2:rxbinding-kotlin:2.1.1'
  7. }

配置 UI

打开 activity_main.xml

将以下"Hello World!"部分

  1. <TextView
  2. android:layout_width="wrap_content"
  3. android:layout_height="wrap_content"
  4. android:text="Hello World!"
  5. app:layout_constraintBottom_toBottomOf="parent"
  6. app:layout_constraintLeft_toLeftOf="parent"
  7. app:layout_constraintRight_toRightOf="parent"
  8. app:layout_constraintTop_toTopOf="parent" />

改为

  1. <GridLayout
  2. android:layout_width="120dp"
  3. android:layout_height="wrap_content"
  4. android:orientation="vertical"
  5. app:layout_constraintLeft_toLeftOf="parent"
  6. app:layout_constraintRight_toRightOf="parent"
  7. app:layout_constraintTop_toTopOf="parent"
  8. android:rowCount="5"
  9. android:columnCount="2"
  10. >
  11. <EditText
  12. android:id="@+id/etNumber1"
  13. android:layout_width="80dp"
  14. android:layout_height="wrap_content"
  15. android:gravity="end"
  16. android:layout_row="0"
  17. android:layout_column="1"
  18. android:inputType="number"
  19. android:hint="0"
  20. android:text="1" />
  21. <EditText
  22. android:id="@+id/etNumber2"
  23. android:layout_width="80dp"
  24. android:layout_height="wrap_content"
  25. android:gravity="end"
  26. android:layout_row="1"
  27. android:layout_column="1"
  28. android:inputType="number"
  29. android:hint="0"
  30. android:text="2" />
  31. <TextView
  32. android:id="@+id/tvAdd"
  33. android:layout_width="wrap_content"
  34. android:layout_height="wrap_content"
  35. android:layout_row="2"
  36. android:layout_column="0"
  37. android:gravity="end"
  38. android:text="+"
  39. android:textAppearance="@style/TextAppearance.AppCompat.Large" />
  40. <EditText
  41. android:id="@+id/etNumber3"
  42. android:layout_width="80dp"
  43. android:layout_height="wrap_content"
  44. android:layout_row="2"
  45. android:layout_column="1"
  46. android:gravity="end"
  47. android:inputType="number"
  48. android:hint="0"
  49. android:text="3" />
  50. <TextView
  51. android:id="@+id/tvResult"
  52. android:layout_row="3"
  53. android:layout_column="1"
  54. android:layout_width="76dp"
  55. android:gravity="end"
  56. android:textAppearance="@style/TextAppearance.AppCompat.Medium"
  57. android:text="16" />
  58. </GridLayout>

控件变量

在 MainActivity 类中的 onCreate 方法中添加以下代码

  1. val etNumber1 = findViewById<EditText>(R.id.etNumber1)
  2. val etNumber2 = findViewById<EditText>(R.id.etNumber2)
  3. val etNumber3 = findViewById<EditText>(R.id.etNumber3)
  4. val tvResult = findViewById<TextView>(R.id.tvResult)

不使用 RxJava 的传统解决方案

在 MainActivity 类中的 onCreate 方法中添加以下代码

  1. val textWatcher = object : TextWatcher {
  2. override fun afterTextChanged(s: Editable?) {
  3. }
  4. override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
  5. }
  6. override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
  7. val num1 = etNumber1.text.toString().toIntOrNull() ?: 0
  8. val num2 = etNumber2.text.toString().toIntOrNull() ?: 0
  9. val num3 = etNumber3.text.toString().toIntOrNull() ?: 0
  10. tvResult.text = (num1 + num2 + num3).toString()
  11. }
  12. }
  13. etNumber1.addTextChangedListener(textWatcher)
  14. etNumber2.addTextChangedListener(textWatcher)
  15. etNumber3.addTextChangedListener(textWatcher)
  16. etNumber1.text = etNumber1.text

使用 RxJava 的解决方案

在 MainActivity 类中的 onCreate 方法中添加以下代码

  1. Observables.combineLatest(RxTextView.textChanges(etNumber1), RxTextView.textChanges(etNumber2), RxTextView.textChanges(etNumber3))
  2. {s1, s2, s3 -> ((s1.toString().toIntOrNull() ?: 0) + (s2.toString().toIntOrNull() ?: 0) + (s3.toString().toIntOrNull() ?: 0)).toString()}
  3. .subscribeOn(Schedulers.io())
  4. .observeOn(AndroidSchedulers.mainThread())
  5. .subscribe(RxTextView.text(tvResult))

ReactiveX 学习笔记(20)使用 RxJava + RxBinding 进行 GUI 编程的更多相关文章

  1. ReactiveX 学习笔记(0)学习资源

    ReactiveX 学习笔记 ReactiveX 学习笔记(1) ReactiveX 学习笔记(2)创建数据流 ReactiveX 学习笔记(3)转换数据流 ReactiveX 学习笔记(4)过滤数据 ...

  2. Ext.Net学习笔记20:Ext.Net FormPanel 复杂用法

    Ext.Net学习笔记20:Ext.Net FormPanel 复杂用法 在上一篇笔记中我们介绍了Ext.Net的简单用法,并创建了一个简单的登录表单.今天我们将看一下如何更好是使用FormPanel ...

  3. SQL反模式学习笔记20 明文密码

    目标:恢复或重置密码 反模式:使用明文存储密码 1.存储密码 使用明文存储密码或者在网络上传递密码是不安全的. 如果攻击者截取到你用来插入(或者修改)密码的sql语句,就可以获得密码.     黑客获 ...

  4. golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题

    golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题 下面这个程序运行的能num结果是什么? package main import ( "fmt" " ...

  5. [原创]java WEB学习笔记20:MVC案例完整实践(part 1)---MVC架构分析

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  6. ‎Cocos2d-x 学习笔记(20) ControlButton

    [Cocos2d-x 学习笔记 目录链接] 1. 简介 ControlButton实现了按钮功能,根据触摸的位置和移动的过程可识别9中EventType类型,执行对应的回调函数. 直接继承了Contr ...

  7. 学习笔记(一)--->《Java 8编程官方参考教程(第9版).pdf》:第一章到六章学习笔记

    注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.违者本人不负法律责任.违法者自负一切法律责任. ...

  8. [原创]java WEB学习笔记27:深入理解面向接口编程

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  9. ReactiveX 学习笔记(12)调度器

    Schedulers, threading and testing 本文的主题为调度器,多线程以及测试. RxJava操作符(六)Utility SubscribeOn / ObserveOn Sub ...

随机推荐

  1. cut语法2

    linux每日一命令--cut--按文件大小排序 显示前100行 显示后五列 ll -Sh|head -n 100|cut -d ' ' -f 5- 一.基本语法cut是一个选取命令,以行为单位,用指 ...

  2. FreeMarker基础语法,宏,引用 等

    FreeMarker的插值有如下两种类型: 1,通用插值${expr}; 2,数字格式化插值:#{expr}或#{expr;format} ${book.name?if_exists } //用于判断 ...

  3. day 10 函数入门

    def login(): """ """ 执行函数不会报错

  4. seajs引入jquery框架问题

    seajs引入jquery框架时出现的问题 原因:由于seajs是遵循cmd规范,而jquery是遵循amd规范,所以在seajs调用jquery框架时,需要将amd转换为cmd 转换方法:jquer ...

  5. Keras学习笔记(完结)

    使用Keras中文文档学习 基本概念 Keras的核心数据结构是模型,也就是一种组织网络层的方式,最主要的是序贯模型(Sequential).创建好一个模型后就可以用add()向里面添加层.模型搭建完 ...

  6. 集群容器管理之swarm ---集群部署

    集群部署及节点管理 使用swarm前提: Docker版本1.12+ 集群节点之间保证TCP 2377.TCP/UDP 7946和UDP 4789端口通信 节点规划: 操作系统:centos7.4.1 ...

  7. Java多线程入门中几个常用的方法

    一.currentThread()方法 currentThread方法就是返回当前被调用的线程. 该方法为一个本地方法,原码如下: /** * Returns a reference to the c ...

  8. pycharm中添加PATH变量

    最近在pycharm中run程序,终端terminal没有问题,在pycharm找不到$PATH中的变量值,如下图所示 同样的命令,在终端敲就没毛病,终端echo $PATH的时候,显示的是有cuda ...

  9. Lua IDE工具-Intellij IDEA+lua插件配置教程(Chianr出品)

    Lua 编译工具IDE-Intellij IDEA 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Ch ...

  10. BZOJ - 3170: 松鼠聚会 (切比雪夫转曼哈顿距离)

    pro:  有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最短距离.0&l ...