在使用MVVM模式来开发应用时,我们在布局文件中有可能使用到DataBinding 。
例如在登录界面里,我们通常都是要检验输入的用户名和密码不能为空才可以进行登录。
在这种场景下,可以直接可以在布局文件中使用Databinding直接对Edittext的数据进行检查,若其中有一个信息为空,则登录按钮禁用,就可以省去在Activity写很多的检查代码。
1. 如何获取所有Edittext 输入的文本信息
EditText通过双向数据绑定 @={} ,把用户输入的信息分别存放到两个临时变量里 。其他控件则可以取出EditText的值。
<data>
<!-- ViewModel 层-->
<variable
name="loginModel"
type="" />
<!-- 临时变量,记录EditText输入的值-->
<variable
name="username"
type="String" />
<variable
name="password"
type="String" />
</data>
<
android:
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:text="@={username}" />
<
android:
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:singleLine="true"
android:text="@={password}" />
2. Databinding表达式判断EditText的数据是否为空
先知道Databinding条件判断语法如下:
<!--TextView-->
android:text='@{username==null?"null":username}'
上面意思是,TextView如果表达式username为null时,则显示“null”, 不为空显示username的值。也可以通过Databinding的空判断运算符 ‘??’ 简写为这样
android:text='@{username??"null"}'
有点类似于Kotlin 的 ?: 运算符
variable中的临时变量username,password默认值都为null ,但如果先输入了一些数据然后全部删除了,则临时变量的值为空字符串。所以检查username,password不能直接判空,而是使用TextUtils这个Java工具类进行判断,而且要同时判断两个临时变量的值。但问题Databinding并不支持直接写与 && 这样的运算符,所以我们也可以用三元表达式实现。
<data>
<!--使用Java某些类都要通过import导入才能正常使用-->
<import type="" alias="textUtlis" />
.....
</data>
<
android:
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:enabled="@{!(username)?!(password)?true:false:false}"
android:onClick='@{v->(username ?? "",password ?? "",v) }'
android:text="登陆" />
登陆按钮中,enabled属性设置了
android:enabled="@{!(username)?!(password)?true:false:false}"
首先用三目运算符判断username,username不为空时,继续用三目运算符判断password 这样嵌套判断,从而实现多个条件判断。上面等同于 ( !(username) && !(password)) 这样的意思
3. Databinding表达式使用 && 进行多条件判断
我们都希望可以在databinding layout表达式中直接使用&& 逻辑判断,但遗憾会报错!这里可以使用&的转义字符 & 替代,则上面的用户名密码判空操作可以直接写成
android:enabled="@{!(username) & & !(password)}"
最后经测试,Databinding判断或逻辑表达式中, 不需要转义的有 > , || , == , != ;需要转义的 < ,&& 。关于转义字符可以参考html转义字符。这里常用的参考:
字符 | 转义字符 |
> | > |
< | < |
& | & |
" | " |