进入到准备工作之中。。。。。。
1.启用databinding
在主工程app的build.gradle的android {}中加入:
android { dataBinding { enabled = true } compileSdkVersion 26
2 .配置AndroidManifest
添加基本权限:
android:name="android.permission.INTERNET" />
android:name="android.permission.ACCESS_WIFI_STATE" />
android:name="android.permission.READ_PHONE_STATE" />
android:name="android.permission.ACCESS_NETWORK_STATE" />
android:name="android.permission.READ_EXTERNAL_STORAGE" />
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
先创建一个实体类:
public class UserEntity {
private String username;
private String nickname;
private int age;
public UserEntity() {
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public UserEntity(String username, String nickname, int age) {
this.username = username;
this.nickname = nickname;
this.age = age;
}
}
再来看看布局xml文件:
type="com.study.bin.androidframestudy.mvvm.bean.UserEntity"/>
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.study.bin.androidframestudy.mvvm.view.MainActivity"
>
android:layout_height="wrap_content"
android:text="@{user.username}"/>
android:layout_height="wrap_content"
android:text="@{`姓名:`+user.nickname}"/>
android:layout_height="wrap_content"
android:background="@{user.age < 30 ? 0xFF0000FF:0xFFFF0000}"
android:text="@{String.valueOf(user.age)}"/>
在data中定义的variable节点,name属性表示变量的名称,type表示这个变量的类型,实例就是我们实体类的位置,当然,这里你也可以换这种方式:
<data>
<import type="org.lenve.databinding1.UserEntity"/>
<variable
name="user"
type="UserEntity"/>
</data>
先使用import节点将UserEntity导入,然后直接使用即可。但是如果这样的话又会有另外一个问题,假如我有两个类都是UserEntity,这两个UserEntity分属于不同的包中,又该如何?看下面:
<data>
<import type="org.lenve.databinding1.UserEntity" alias="Lenve"/>
<variable
name="user"
type="Lenve"/>
</data>
在import节点中还有一个属性叫做alias,这个属性表示我可以给该类取一个别名,我给UserEntity这个实体类取一个别名叫做Lenve,这样我就可以在variable节点中直接写Lenve了。
在布局文件中,TextView的text属性被我直接设置为了@{user.username},就可以是获取user的username值,
你也可以将它当做String使用,如@{姓名:
+user.nickname},
由于TextView的text属性时要字符串的,所以我们需要转型,如@{String.valueOf(user.age)},
获取根据条件进行属性该变,如@{user.age < 30 ? 0xFF0000FF:0xFFFF0000}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MvvmLayoutBinding layoutBinding = DataBindingUtil.setContentView(this, R.layout.mvvm_layout);
UserEntity user = new UserEntity();
user.setAge(34);
user.setUsername("binzai");
user.setNickname("彬仔");
layoutBinding.setUser(user);
}
}
DataBindingUtil 在support-v4:24版本以上才有,
另外,不知道你测试的时候有木有发现MvvmLayoutBinding这个类居然没有,其实确实是没有这个类,那这个类在哪里呢?其实这个类名是就是根据这个Activity引用的这个布局文件生成出来的,这个类名就是省略了下划线的布局文件名。
完工。