首先讲讲什么是MVP设计模式:

Model 依然是业务逻辑和实体模型
View 对应于Activity,负责View的绘制以及与用户交互
Presenter 负责完成View于Model间的交互

然后看看具体分包图

运行截图:

具体代码如下:

- 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(2000);                } 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"?>"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">    .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"        >        .support.design.widget.TextInputEditText            android:id="@+id/et_name"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:maxLength="11"            android:hint="请输入账号"            />    .support.design.widget.TextInputLayout>    .support.design.widget.TextInputLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_margin="5dp"        app:passwordToggleEnabled="true"        >        .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="请输入密码"/>    .support.design.widget.TextInputLayout>    

- 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

更多相关文章

  1. Android报No resource found that matches the given name问题的
  2. Android(安卓)使用MVPHelper工具生成,MVPDemo模拟登录演示
  3. android注册 登录+修改帐号密码+添加资料+给指定帐号充值
  4. android MVC和MVP探讨
  5. Android实现从相册截图的功能
  6. Android中解决破解签名验证之后导致的登录授权失效问题
  7. Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实
  8. Android以当前Activity为基准进行截屏
  9. Android全屏截图的方法,返回Bitmap并且保存在SD卡上

随机推荐

  1. Android中native进程内存泄露的调试技巧
  2. Android(安卓)手机上安装并运行 Ubuntu 1
  3. 谈谈移动应用开发环境
  4. Android如何扩大按钮点击区域
  5. Android软件广告屏蔽方法及代码
  6. Android(安卓)性能优化之使用MAT分析内存
  7. Android: NDK编程入门笔记
  8. 如何使用 Eclipse 给 Android(安卓)模拟
  9. 关于android的9path图片处理
  10. windows下用ADT进行android NDK开发的详