首先講講什麼是MVP設計模式:
Model 依然是業務邏輯和實體模型
View 對應于Activity,負責View的繪制以及與使用者互動
Presenter 負責完成View于Model間的互動
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0NXYFhGd192UvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2Lc1TPBVGN0dlWrljMZZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DOzQDMyUTN1EDNwUDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
然後看看具體分包圖
運作截圖:
具體代碼如下:
- M層
實體類UserBean.class
public class UserBean {
public String username;
public String password;
}
登入回調接口
public interface OnLoginListener {
void getDataSuccess(UserBean userBean);
void getDataFail(String msg);
}
IUserBiz.class
public interface IUserBiz {
void login(String username,String password,OnLoginListener onLoginListener);
}
UserBiz.class
public class UserBiz implements IUserBiz {
@Override
public void login(final String username, final String password, final OnLoginListener onLoginListener) {
new Thread(){
@Override
public void run() {
try {
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
if("kxx".equals(username) && "123".equals(password)){
UserBean userBean = new UserBean();
userBean.username = username;
userBean.password = password;
onLoginListener.getDataSuccess(userBean);
}else {
onLoginListener.getDataFail("使用者名或密碼錯誤");
}
}
}.start();
}
}
- V層
ILoginView.class
public interface ILoginView {
String getUserName();
String getPassWord();
void showLoading();
void hideLoading();
void showSuccessData(UserBean userBean);
void showFailData(String msg);
void clearData();
}
登入界面 LoginView.class
public class LoginView extends AppCompatActivity implements ILoginView,View.OnClickListener {
private TextInputLayout tl_name;
private TextInputEditText et_name;
private TextInputEditText et_pwd;
private Button bt_login;
private Button bt_clear;
private ProgressDialog dialog;
private UserPresenter userPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
initView();
}
private void initView() {
tl_name = (TextInputLayout) findViewById(R.id.tl_name);
et_name = (TextInputEditText) findViewById(R.id.et_name);
et_pwd = (TextInputEditText) findViewById(R.id.et_pwd);
bt_clear = (Button) findViewById(R.id.bt_clear);
bt_login = (Button) findViewById(R.id.bt_login);
bt_login.setOnClickListener(this);
bt_clear.setOnClickListener(this);
userPresenter = new UserPresenter(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.bt_login:
// et_name.setError("格式不正确");
// tl_name.setError("格式不正确");
userPresenter.login();
break;
case R.id.bt_clear:
userPresenter.clear();
break;
}
}
@Override
public String getUserName() {
return et_name.getText().toString();
}
@Override
public String getPassWord() {
return et_pwd.getText().toString();
}
@Override
public void showLoading() {
dialog = new ProgressDialog(this);
dialog.setMessage("Loading...");
dialog.show();
}
@Override
public void hideLoading() {
if(dialog != null && dialog.isShowing()){
dialog.dismiss();
}
}
@Override
public void showSuccessData(UserBean userBean) {
Toast.makeText(this, "@@@"+userBean.username+"---"+userBean.password, Toast.LENGTH_SHORT).show();
}
@Override
public void showFailData(String msg) {
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}
@Override
public void clearData() {
et_name.setText("");
et_pwd.setText("");
}
布局檔案
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:focusableInTouchMode="true"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.TextInputLayout
android:id="@+id/tl_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:counterMaxLength="11"
app:counterEnabled="true"
android:layout_margin="5dp"
app:errorEnabled="true"
>
<android.support.design.widget.TextInputEditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLength="11"
android:hint="請輸入賬号"
/>
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
app:passwordToggleEnabled="true"
>
<android.support.design.widget.TextInputEditText
android:id="@+id/et_pwd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLength="11"
android:inputType="textPassword"
android:hint="請輸入密碼"/>
</android.support.design.widget.TextInputLayout>
<Button
android:id="@+id/bt_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="登入"
android:background="@color/colorAccent"
android:textColor="#fff"
/>
<Button
android:id="@+id/bt_clear"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="清空"
android:background="@color/colorPrimaryDark"
android:layout_marginTop="15dp"
android:textColor="#fff"
/>
</LinearLayout>
- P層
UserPresenter.class
public class UserPresenter {
private LoginView loginView;
private UserBiz userBiz;
Handler handler = new Handler();
public UserPresenter(LoginView loginView) {
this.loginView = loginView;
userBiz = new UserBiz();
}
public void login() {
loginView.showLoading();
userBiz.login(loginView.getUserName(), loginView.getPassWord(), new OnLoginListener() {
@Override
public void getDataSuccess(final UserBean userBean) {
handler.post(new Runnable() {
@Override
public void run() {
loginView.showSuccessData(userBean);
loginView.hideLoading();
}
});
}
@Override
public void getDataFail(final String msg) {
handler.post(new Runnable() {
@Override
public void run() {
loginView.showFailData(msg);
loginView.hideLoading();
}
});
}
});
}
public void clear() {
loginView.clearData();
}
}
源碼下載下傳位址:http://download.csdn.net/detail/codekxx/9833505