最近的一个项目使用的是MVVM框架,由于之前没有使用过所以初次使用还是费了一点时间的。框架本身的思路不难理解,但是要想在这个框架中进行很流畅的开发,DataBinding的熟练使用时最基本的前提。话不多说今天就总结下常见的绑定用法。
简单说DataBinding使用流程:
android { dataBinding { enabled true } }
1.选中根布局,Alt+Enter
之后变成这样
2. 创造Binding 对象(编一下,项目中会生成这个Binding对象,比如:activity_main_mvvm去掉_之后的首字母大写+Binding)
activity里面
ActivityMainMvvmBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main_mvvm);
fragment里面或者Adapter绑定Item布局
FragmentMainMvvmBinding binding
= DataBindingUtil.inflate(inflater, R.layout.fragment_main_mvvm, container, false);
这样通过这个对象就可以找到布局中的控件了,比如布局中R.id.tv_name; java代码中binding.tvName;省去了findViewById
3.将实体Enity与布局建立关联,这样布局中的就可以直接使用该实体对象的数据了,即是达到了绑定的目的。
<data>
<variable
name="userInfo"
type="com.example.laoliu.mytest1.UserInfoEnity" />
</data>
一 .绑定数据
1.简单的数据绑定 (实体里面的某个字段直接展示)
<TextView android:id="@+id/tv_name" android:layout_width="match_parent" android:layout_height="40dp" android:background="#e9b1b1" android:gravity="center" android:text="@{userInfo.name}" />
<TextView android:id="@+id/tv_name" android:layout_width="match_parent" android:layout_height="40dp" android:background="#e9b1b1" android:gravity="center" android:text="@{userInfo.name,default=`游客`}" />
2.如果说控件不是直接展示enity字段内容,而是根据不同的值来展示不同的文字。大致分为以下几种情况:
情况一:.对某个字段自定义属性,即是在enity类里面进行定义属性。(enity的某个字段类型比较多,含义比较丰富,在xml很难表达或者在xml表达会导致易读性差)
//根据userType 显示不同的用户类型。value对应的值:自定义属性。第一个参数:控件。第二个参数:绑定的数据。
Enity中:
@BindingAdapter(value = {"userTypeShow"}, requireAll = false)
public static void setUserName(TextView textView, String userType) {
if (userType != null) {
switch (userType) {
case "0":
textView.setText("游客");
case "1":
textView.setText("普通用户");
break;
case "2":
textView.setText("VIP用户");
break;
}
}
}
xml使用:
<TextView
android:id="@+id/tv_userType"
android:layout_width="wrap_content"
android:layout_height="17dp"
android:layout_marginLeft="10dp"
android:background="@drawable/level_bg"
android:gravity="center"
android:textColor="#FFFFFFFF"
android:textSize="12sp"
android:visibility="gone"
app:userTypeShow="@{userInfo.userType}" />
另外ImageView加载在线url图片,也可用此方法处理。
情况二:将网络请求返回的实体进行再处理,将不能直接展示的字段用其他的字段代替,以使控件可以直接展示。这里不做示例。
二.三目运算符
1.boolean
android:visibility="@{userInfo.checked!=null? View.VISIBLE:View.GONE}" //字段本来的属性
public boolean isChecked() { //对某个字段处理然后在获取
if (!Utils.isEmpty(isRealNameCheck)) {
return true;
}
return false;
}
在xml直接使用
android:visibility="@{userInfo.isChecked? View.VISIBLE:View.GONE}"
2.int
android:text="@{userInfo.userName==0? userInfo.userName: `游客`}"
android:text="@{userInfo.userName==1? userInfo.userName: @string/redacted }"
3.非空处理
android:text="@{userInfo.userName?? @string/redacted }"
相当于
android:text="@{userInfo.userName==null? userInfo.userName: @string/redacted }"
4.其他
android:padding="@{isBig ? @dimen/bigPadding : @dimen/smallPadding}"
Format字符串格式:
android:text="@{@string/nameFormat(firstName, lastName)}"
<Button android:onClick="@{isManager ? handlers.managerClick : handlers.managerClick}"/>
三 点击事件的绑定
//无参数
public void onItemClick0() {
Log.e("TAG", "onItemClick1");
}
//一个参数 View
public void onItemClick1(View view) {
Log.e("TAG", "onItemClick1:view");
}
//两个参数 public void onItemClick1(String userName) {
Log.e("TAG", "onItemClick1:userName");
}
//两个参数
public void onItemClick2(View view, String userName) {
Log.e("TAG", "onItemClick1");
Toast.makeText(view.getContext(), userName, Toast.LENGTH_LONG).show();
}
xml:
@{() -> clickEvent.onItemClick0()} onItemClick0()//onItemClick0()
android:onClick="@{clickevent.onItemClick1}"
相当于android:onClick="@{clickevent::onItemClick1}" //onItemClick1(View view)
@{() -> clickEvent.onItemClick1(userInfo.userName)} //onItemClick1(String userName)
@{(view) -> clickEvent.onItemClick1(userInfo.userName)} //onItemClick2(View view, String userName)
注意:字符串`` 表示, 或者@string/**
对于使用View.Visible 需要导包 集合之类的也需要
对于两个参数 要导包
<variable name="view" type="View"/>