在ActvityDetail2Binding实例构造的时候调用了mapBindings,一次解决了所有View的查找,mapBindings函数在ActvityDetail2Binding父类ViewDataBinding中实现。 3 使用表达式在layout.xml中填充model数据在ActivityDetail2.java中还存在大量的View控制、数据填充代码,如何把这些代码在交给layout.xml完成呢? 3.1 ModelAdapter类第2节中已经定义了User.java类作为Model类,但是我们经常会遇到Model类和真正View展示不一致的情况,本例子中定义一个来ModelAdapter类来完整Model数据到展示数据的适配。示例代码为ActivityDetail3.java的内部类,可以调用ActivityDetail3.java中的函数,代码定义如下: public class DetailActivity3 extends AppCompatActivity { public class ModelAdapter { private User user; public ModelAdapter(User user) { this.user = user;} public String getName(){ return user != null ? user.getName() : null;} public Drawable getAvatar(){ return user != null ? ContextCompat.getDrawable(DetailActivity3.this,user.getAvatar()) : null; } public String getDesc(){ return user != null ? String.format("积分:%d 等级:%d",user.getScore(),user.getLevel()) : null; } public String actionText(){ return user != null ? "退出登录" : "登陆"; } public void clickHandler(View view){ if (user != null) logout(); else login(); } }}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
3.2 activity_detail3.xml中使用model同样复制一份activity_detail2.xml为activity_detail3.xml,在<layout>节点加入<data>节点,并且在里面定义需要用的model类(比如ModelAdapter adapter),当然也可以是基础类型变量(比如int visibility); 随后,就可以在下面的view中使用表达式了,全部布局文件如下: <?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="adapter" type="com.asha.demo.DetailActivity3.ModelAdapter"/> <variable name="visibility" type="int"/> </data> <LinearLayout android rientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <View android:background="@color/detail_background" android:layout_width="match_parent" android:layout_height="66dp"> </View> <ImageView android:src="@{adapter.avatar}" android:visibility="@{visibility}" android:id="@+id/detail_avatar" android:layout_gravity="center" android:layout_marginTop="-33dp" android:layout_width="66dp" android:layout_height="66dp" /> <TextView android:visibility="@{visibility}" android:text="@{adapter.name}" android:id="@+id/detail_name" android:textSize="17sp" android:textColor="@color/textColorPrimary" android:layout_marginTop="15dp" android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:visibility="@{visibility}" android:text="@{adapter.desc}" android:id="@+id/detail_desc" android:layout_marginTop="15dp" android:textSize="13sp" android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:text="@{adapter.actionText}" android nClick="@{adapter.clickHandler}" android:id="@+id/detail_action_button" android:layout_marginTop="15dp" android:layout_gravity="center" android:textColor="@color/white" android:background="@drawable/selector_g_button" android:layout_width="220dp" android:layout_height="wrap_content" /> </LinearLayout></layout>
|