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

在使用MVVM模式来开发应用时,我们在布局文件中有可能使用到DataBinding 。

例如在登录界面里,我们通常都是要检验输入的用户名和密码不能为空才可以进行登录。

在这种场景下,可以直接可以在布局文件中使用Databinding直接对Edittext的数据进行检查,若其中有一个信息为空,则登录按钮禁用,就可以省去在Activity写很多的检查代码。

 

1.  如何获取所有Edittext 输入的文本信息

    EditText通过双向数据绑定 @={} ,把用户输入的信息分别存放到两个临时变量里 。其他控件则可以取出EditText的值。

<data>

     <!-- ViewModel 层-->  
     <variable
          name="loginModel"
          type="com.zzh.haohm.ui.login.LoginViewModel" />


     <!-- 临时变量,记录EditText输入的值-->
     <variable
          name="username"
          type="String" />

     <variable
          name="password"
          type="String" />

</data>
 <androidx.appcompat.widget.AppCompatEditText
                android:id="@+id/et_userName"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"                
                android:singleLine="true"
                android:text="@={username}"  />


 <androidx.appcompat.widget.AppCompatEditText
                android:id="@+id/et_psw"
                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="android.text.TextUtils" alias="textUtlis" />

     .....

</data>
 <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/bt_login"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:enabled="@{!textUtlis.isEmpty(username)?!textUtlis.isEmpty(password)?true:false:false}"
            android:onClick='@{v->loginModel.login(username ?? "",password ?? "",v) }'
            android:text="登陆" />

 

登陆按钮中,enabled属性设置了 

android:enabled="@{!textUtlis.isEmpty(username)?!textUtlis.isEmpty(password)?true:false:false}"

首先用三目运算符判断username,username不为空时,继续用三目运算符判断password 这样嵌套判断,从而实现多个条件判断。上面等同于  ( !TextUtlis.isEmpty(username) && !TextUtlis.isEmpty(password))  这样的意思

 

3.  Databinding表达式使用 && 进行多条件判断

我们都希望可以在databinding layout表达式中直接使用&& 逻辑判断,但遗憾会报错!这里可以使用&的转义字符 &amp; 替代,则上面的用户名密码判空操作可以直接写成

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

 

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值