MVVM:Model-代表你的基本业务逻辑 View-显示的内容 ViewModel--将Model 和 View联系起来的对象
想要使用这种模式开发android程序可以使用Google提供的一种方式 data Binding Library
最低要求:API level7 Gradle 15.0
在android6.0的API中如图:
第一步:在build.gradle(Module:app)中添加dataBinding,然后点击右上角的同步
android {
dataBinding{
enabled=true;
}
}
启用dataBinding
第二步:创建一个JAVA BEAN对象 本例以User(userName,password)对象为例
public class User {
public String userName;
public String password;
}
修饰符是public 不需要getter,setter方法
再创建一个Event对象 UserEvent.java
这样就可以将user对页面上的控件的值进行对应,修改控件的值会自己修改user对象的值,反之亦然
public class UserEvent {
private User user;
//构造函数,将user传进来
public UserEvent(User user) {
this.user = user;
}
//对userName的监听
public TextWatcher userNameWatcher = 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) {
}
@Override
public void afterTextChanged(Editable s) {
//将改变后的值给user对象
user.userName = s.toString();
}
};
//对password的监听
public TextWatcher passwordWatcher = 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) {
}
@Override
public void afterTextChanged(Editable s) {
//将改变后的值给user对象
user.password=s.toString();
}
};
}
创建一个事件的监听对象MyHandler.java
public class MyHandler {
private User user;
private Activity context;
private ProgressDialog pd;
//构造传参
public MyHandler(User user,Activity context,ProgressDialog pd){
this.user=user;
this.context=context;
this.pd=pd;
}
//登录事件
public void onClickLoginUser(View v){
if(TextUtils.isEmpty(user.userName) || TextUtils.isEmpty(user.password)){
showToast("用户名或密码为空");
}else{
pd.show();
new Thread(new Runnable() {
@Override
public void run() {
//判断是否登录成功
UserLoginNet net=new UserLoginNet();
if(net.sendUserInfo(user)){
showToast("欢迎回来:"+user.userName);
}else{
showToast("用户名或密码错误");
}
}
}).start();
}
}
private void showToast(final String content){
context.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(context,content,Toast.LENGTH_SHORT).show();
pd.dismiss();
}
});
}
}
第三步:在布局文件最外层添加
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="event"
type="com.example.yangzhi.mvvm.UserEvent"></variable>
<variable
name="handler"
type="com.example.yangzhi.mvvm.MyHandler"></variable>
</data>
</layout>
将原布局文件的xmlns:android="http://schemas.android.com/apk/res/android"
放到现在的<layout>中
然后在控件的属性中添加: addTextChangedListener需要自己输入,我试了一下没有提示,也不需要android:text属性
addTextChangedListener="@{event.userNameWatcher}"
整体代码
<EditText
addTextChangedListener="@{event.userNameWatcher}"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入用户名" />
<EditText
addTextChangedListener="@{event.passwordWatcher}"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入密码" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{handler.onClickLoginUser}"
android:text="登录" />
button的设置点击事件得注意一下,可别忘了
其它布局不变
第四步:在MainActivity.java的onCreate方法中的配置
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
//这个就不再需要
//setContentView(R.layout.activity_main);
user = new User();
UserEvent event = new UserEvent(user);
binding.setEvent(event);
ProgressDialog pd=new ProgressDialog(this);
MyHandler myHandler=new MyHandler(user,this,pd);
binding.setHandler(myHandler);
整体代码,其实就上述代码:
public class MainActivity extends AppCompatActivity {
private User user;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
//这个就不再需要
//setContentView(R.layout.activity_main);
user = new User();
UserEvent event = new UserEvent(user);
binding.setEvent(event);
ProgressDialog pd=new ProgressDialog(this);
MyHandler myHandler=new MyHandler(user,this,pd);
binding.setHandler(myHandler);
}
}
整个activity的代码就上面那一点,其它的操作都放到其它文件中去了,不管是与控件相关的还是联网操作的都在其它文件
时间: 2024-10-11 18:56:15