登录场景与语音识别场景为例说明Android中MVVM的实现原理,登录场景:
model:
public class User {
private String userName;
private String password;
public User(String userName, String password) {
this.userName = userName;
this.password = password;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
view:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<data>
<variable
name="loginViewModel"
type="com.example.speechapi.mvvm_login.LoginViewModel" />
</data>
<EditText
android:id="@+id/username_et"
android:layout_width="match_parent"
android:layout_height="wrap_content"></EditText>
<EditText
android:id="@+id/password_et"
android:layout_width="match_parent"
android:layout_height="wrap_content"></EditText>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="@{loginViewModel.loading? false:true}"
android:onClick="@{loginViewModel.login()}"
android:text="登录"></Button>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{loginViewModel.clear()}"
android:text="清除用户名和密码">
</Button>
</layout>
public class LoginActivity extends AppCompatActivity implements LoginListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityLoginBinding activityLoginBinding = DataBindingUtil.setContentView(this, R.layout.activity_login);
LoginViewModel loginViewModel = new LoginViewModel(this, activityLoginBinding);
activityLoginBinding.setLoginViewModel(loginViewModel);
}
@Override
public void onLoginSucceed() {
}
@Override
public void onLoginFailed(int errorCode) {
}
}
viewModel:
public class LoginViewModel {
public final ObservableBoolean loading = new ObservableBoolean(false);
private LoginListener loginListener;
private ActivityLoginBinding activityLoginBinding;
public LoginViewModel(LoginListener loginListener,ActivityLoginBinding activityLoginBinding) {
this.loginListener = loginListener;
this.activityLoginBinding = activityLoginBinding;
}
public void login() {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
}catch (Exception e) {
e.printStackTrace();
loading.set(false);
}
if (activityLoginBinding.usernameEt.getText().toString().equals("zhangsan")&&activityLoginBinding.passwordEt.getText().toString().equals("123")) {
loginListener.onLoginSucceed();
loading.set(true);
} else {
loginListener.onLoginFailed(100);
loading.set(false);
}
}
}).start();
}
public void clear() {
activityLoginBinding.usernameEt.setText("");
activityLoginBinding.passwordEt.setText("");
}
}
databinding设置:
dataBinding {
enabled true
}
语音识别场景:
model:
public class AsrResult {
private int status;
private String asrResult;
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getAsrResult() {
return asrResult;
}
public AsrResult(int status, String asrResult) {
this.status = status;
this.asrResult = asrResult;
}
public void setAsrResult(String asrResult) {
this.asrResult = asrResult;
}
}
view:
public class AsrActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityAsrBinding activityAsrBinding =
DataBindingUtil.setContentView(this,R.layout.activity_asr);
AsrViewModel asrViewModel = new AsrViewModel();
activityAsrBinding.setAsrViewModel(asrViewModel);
}
}
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<data>
<variable
name="asrViewModel"
type="com.example.speechapi.mvvm_asr.AsrViewModel" />
</data>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{asrViewModel.asrResult.asrResult}"></TextView>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{asrViewModel.getAsrResult()}">
</Button>
</layout>
viewModel:
public class AsrViewModel {
private AsrResult asrResult;
public void getAsrResult() {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
asrResult = new AsrResult(1,"今天");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}