M:model,业务逻辑
V:加载视图,和layout通信,进行数据绑定与更新,对应Activity(由于代码是在太少,有时自带启动自己的方法)
VM:判断条件,逻辑实现
要注意项目的框架
还有环境配置
dataBinding{
enabled=true
}
LoginViewModel:
public ObservableField<String> loginMessage;
public ObservableInt loginMessageVisibility;
private String editTextUsernameValue = "";
private String editTextPasswordValue = "";
public LoginViewModel(Context context) {
this.context = context;
this.loginMessage = new ObservableField<>("");
this.loginMessageVisibility = new ObservableInt(View.INVISIBLE);
}
//登陆,实际上这个方法是在layout文件中调用的
public void loginAuthentication(View view) {
if ((editTextUsernameValue.equals("lqy")) &(editTextPasswordValue.equals("123")){
loginMessage.set("");
loginMessageVisibility.set(View.INVISIBLE);
User user = new User(editTextUsernameValue, editTextPasswordValue);
context.startActivity(MainActivity.newIntent(context, user));
} else if ((editTextUsernameValue.equals("")) (editTextPasswordValue.equals("")){
loginMessage.set("Username or Password can't be empty!");
loginMessageVisibility.set(View.VISIBLE);
} else {
loginMessage.set("Username = lqy \n Password = 123");
loginMessageVisibility.set(View.VISIBLE);
}
}
//观察Text变化的TextWatcher
public TextWatcher getUsernameUpdate() {
return new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1,inti2{
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
editTextUsernameValue = charSequence.toString();
}
@Override
public void afterTextChanged(Editable editable) {
}
};
}
public TextWatcher getPasswordUpdate() {
return new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1,inti2{
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
editTextPasswordValue = charSequence.toString();
}
@Override
public void afterTextChanged(Editable editable) {
}
};
}
@Override
public void destroy() {
}
}
MainActivity
还有就是一些layout文件,根据个人感觉进行调整。
要注意layout文件的id重复,调用错误。
MVVM总结:通过View加载布局,并通过布局调ViewModel中的方法,VeiwModel可以通过调用后的结果决定启动什么视图,同时ViewModel保持和model的通信。
————————————————