书承上文,这次我们来探究一下生命周期绑定和双向绑定,然后会介绍一种架构模式MVVM。
一、双向绑定(tow-way binding)
前面我们讲的都是单项绑定策略,即数据单方面通知视图已经更新。这里我们就来讲讲双向绑定的策略。
先来看看现实中一个很简单的需求吧。假如我们现在有一个TextView和一个EditText控件,其中EditText使用的是密码本格式,要求我们在用户输入信息未提交时,显示某种算法加密后的密文时什么样的,显式在TextView中。
按照一般的方法,我们可以先设置一个TextChange的事件,它会在EditText文本变换时读取变换后的文本,然后将它通过加密获得密文,最后使用setText方法写入TextView的。这个方法固然可以,但是却有很多代码,增加了代码的复杂性,降低了可阅读性。
因此,我们可以使用双向绑定数据的办法。双向绑定方法的使用非常简单,与单项基本上是相似的,只是在使用在布局文件定义的变量时吧@{变量}改为@={变量}即可双向绑定。使用@={}方式绑定后,绑定的属性值变化会通知到绑定的变量,使变量可以做出相应的反应。
我们继续使用前面文章例子中的变量book,在布局文件中添加一个EditText控件,具体代码如下。
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data class="MainBinding">
......
<import type="android.util.Base64"/>
......
<variable
name="book"
type="com.silencer.db.entity.ObservableBook" />
</data>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
.......>
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:id="@+id/main_text"
android:text='@{Base64.encodeToString(book.name.getBytes(),0)}'/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/main_et"
android:text='@={book.name}'/>
</LinearLayout>
</layout>
可以看到,我在变量声明的地方引入了Base64这个类来充当加密类。EditText使用了双向绑定,TextView使用了单向绑定。运行一下查看结果