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>
放到如今的<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的代碼就上面那一點,其它的操做都放到其它文件中去了,無論是與控件相關的仍是聯網操做的都在其它文件