记录Android jetpack MVVM使用DataBinding 表达式多条件判断&&检查验证EditText表单数据

时间:2025-02-08 13:20:29

在使用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表达式中直接使用&& 逻辑判断,但遗憾会报错!这里可以使用&的转义字符 &amp; 替代,则上面的用户名密码判空操作可以直接写成

android:enabled="@{!(username) &amp; &amp;  !(password)}"

 

最后经测试,Databinding判断或逻辑表达式中, 不需要转义的有 > ,  || , == , != ;需要转义的  < ,&& 。关于转义字符可以参考html转义字符。这里常用的参考:

字符 转义字符
> &gt;
< &lt;
& &amp;
" &quot;