Android MVP设计模式登录具体实现Material Design风格

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/codekxx/article/details/71171670

首先讲讲什么是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"?>
<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

猜你喜欢

转载自blog.csdn.net/codekxx/article/details/71171670