MVVM的学习
MVVM结构
M:Model层
VM:ViewModel层
M:Model层
关系流程
项目搭建
- 构建环境
在app下的build.gradle文件中先申明启用dataBinding
用以下代码片段来配置 Data Binding:
android {
...
dataBinding {
enabled = true
}
}
-
布局文件(其实也就是view层)
Data Binding 的布局文件有一点不一样,它以 layout 标签作为根标签,并且有一个data 元素和 一个 view 元素作为子标签,这个 view 元素就是你没有使用 Data Binding 时该有的布局文件。以下是一个例 子:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="login" type="com.chen.mvvmtest01.viewmodel.LoginViewModel"/>
</data>
<LinearLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:addTextChangedListener="@{login.nameInputListener}"
android:hint="请输入账户"
android:text="@{login.per.name}"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:addTextChangedListener="@{login.pwdInputListener}"
android:hint="请输入密码"
android:text="@{login.per.pwd}"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:onClick="@{login.loginClickListener}"
android:text="登录"/>
</LinearLayout>
</layout>
- model层(数据对象)
public class Person {
public ObservableField<String> name = new ObservableField();
public ObservableField<String> pwd = new ObservableField();
}
ObservableFields 是具有单个字段的独立的可观察对象。ObservableFields 提供了get、set方法,可以直接使用。
- viewmodel层
public class LoginViewModel {
public Person per;
public TextWatcher nameInputListener = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
per.name.set(String.valueOf(s));
}
@Override
public void afterTextChanged(Editable s) {
}
};
public TextWatcher pwdInputListener = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
per.pwd.set(String.valueOf(s));
}
@Override
public void afterTextChanged(Editable s) {
}
};
public View.OnClickListener loginClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
//per.name.set("chen");
SystemClock.sleep(2000);
if ("chen".equals(per.name.get() ) && "123".equals(per.pwd.get())){
Log.e("msg","登陆成功");
}else {
Log.e("msg","登陆失败");
}
}
}).start();
}
};
public LoginViewModel(ActivityMvvmLoginBinding binding) {
per = new Person();
binding.setLogin(this);
}
}
- 绑定数据
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMvvmLoginBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_mvvm_login);
new LoginViewModel(binding);
}
}
运行效果
接下来,我将继续研究dataBinding的原理和使用方法。