Android MVP模式实现组件和业务逻辑分离

1,Activity代码展示,只需要一下3行重要代码即可完成任何复杂的逻辑

/** * 登录界面 * * @author lipanquan */public class LoginActivity extends MVPBaseActivity {

@Override    protected void setTitle() {        getAOP().setTitle();    }

@Override    protected ActivityPresenter initAOP() {        return new LoginActivityPresenter(this);    }

@Override    public boolean onKeyUp(int keyCode, KeyEvent event) {        return getAOP().onKeyUp(keyCode, event);    }

}

2,登录界面的逻辑控制代码/** * 登录界面的逻辑控制 * Created by lipanquan on 2016/12/7. */public class LoginActivityPresenter extends ActivityPresenter implements        CompoundButton.OnCheckedChangeListener, View.OnTouchListener, View.OnFocusChangeListener, View.OnClickListener {

private static final String KEY_IS_REMEMBER_ME = "isRememberMe";    private static final String KEY_USERNAME = "userName";    private static final String KEY_PASSWORD = "pwd";

@Override    public void setTitle() {        setTitle(R.string.title_login);        setLeft(true, R.drawable.selector_btn_back, R.string.string_back);    }

/**     * 登录界面activity     */    private final MVPBaseActivity activity;

/**     * 构造方法     *     * @param activity MVPBaseActivity对象     */    public LoginActivityPresenter(MVPBaseActivity activity) {        this.activity = activity;    }

@Override    protected MVPBaseActivity getActivity() {        return activity;    }

/**     * 用户名输入框     */    @ViewInject(R.id.et_login_username)    private EditText et_login_username;

/**     * 密码输入框     */    @ViewInject(R.id.et_login_password)    private EditText et_login_password;

/**     * 记住密码     */    @ViewInject(R.id.cb_remember_me)    private CheckBox cb_remember_me;

/**     * 登陆按钮     */    @ViewInject(R.id.bt_login)    private Button bt_login;

/**     * 这个页面     */    @ViewInject(R.id.ll_login_all)    private View ll_login_all;

/**     * 是否记住用户     */    private boolean isAutoLogin = true;

/**     * 用户名icon     */    @ViewInject(R.id.iv_icon_password)    private ImageView iv_icon_password;

/**     * 快速删除用户名按钮     */    @ViewInject(R.id.iv_login_username_del)    private ImageView iv_login_username_del;

/**     * 密码icon     */    @ViewInject(R.id.iv_icon_username)    private ImageView iv_icon_username;

/**     * 快速删除密码按钮     */    @ViewInject(R.id.iv_login_pwd_del)    private ImageView iv_login_pwd_del;

/**     * 找回密码     */    @ViewInject(R.id.tv_retrieve_password)    private TextView tv_retrieve_password;

/**     * 注册     */    @ViewInject(R.id.tv_register)    private TextView tv_register;    @Override    public void onCreate(Bundle savedInstanceState) {        setContentView(R.layout.activity_login);        AnnotateUtils.injectViews(this);        initTitle(getActivity());        initDate();        setListener();    }    /**     * 初始化     */    private void initDate() {        setSwipeBackEnable(true);        // 这是用户名输入框 下一个焦点为密码输入框        et_login_username.setNextFocusDownId(R.id.et_login_password);        isAutoLogin = getBoolean(KEY_IS_REMEMBER_ME, true);        cb_remember_me.setChecked(isAutoLogin);        cb_remember_me.setTextColor(getResColor(                cb_remember_me.isChecked() ? R.color.login_button_bg_color_normal                        : R.color.six_six));        et_login_username.setText(getString(KEY_USERNAME));        et_login_password.setText(getString(KEY_PASSWORD));        iv_icon_username.setEnabled(false);        iv_icon_password.setEnabled(false);        if (!isNull(getString(KEY_USERNAME)))            iv_icon_username.setEnabled(true);        if (!isNull(getString(KEY_PASSWORD)))            iv_icon_password.setEnabled(true);        if (et_login_password.getText().length() > 0                && et_login_username.getText().length() > 0) {            bt_login.setEnabled(true);        }    }    /**     * 设置控件的 监听事件     */    private void setListener() {        cb_remember_me.setOnCheckedChangeListener(this);        bt_login.setOnClickListener(this);        et_login_username.setOnFocusChangeListener(this);        et_login_password.setOnFocusChangeListener(this);        et_login_username.addTextChangedListener(new TextWatcher() {            @Override            public void afterTextChanged(Editable s) {                if (s.toString().length() > 0) {                    if (s.toString().length() > 10) {                        if (!Utils.getInstance().isMobileNO(s.toString())) {                            showToastShort(R.string.toast_phone_error);                        }                        iv_icon_username.setEnabled(true);                        if (et_login_password.getText().length() > 5) {                            bt_login.setEnabled(true);                        }                    } else {                        bt_login.setEnabled(false);                        iv_icon_username.setEnabled(false);                    }                    iv_login_username_del.setVisibility(View.VISIBLE);                } else {                    iv_login_username_del.setVisibility(View.GONE);                    iv_icon_username.setEnabled(false);                }            }        });        // 密码输入限制        et_login_password.addTextChangedListener(new TextWatcher() {            @Override            public void afterTextChanged(Editable s) {                if (s.toString().length() > 0) {                    if (s.toString().length() > 5) {                        if (et_login_username.getText().toString().length() == 11)                            bt_login.setEnabled(true);                        iv_icon_password.setEnabled(true);                    } else {                        iv_icon_password.setEnabled(false);                    }                    iv_login_pwd_del.setVisibility(View.VISIBLE);                } else {                    bt_login.setEnabled(false);                    iv_login_pwd_del.setVisibility(View.GONE);                    iv_icon_password.setEnabled(false);                }            }        });        iv_login_username_del.setOnClickListener(this);        iv_login_pwd_del.setOnClickListener(this);        ll_login_all.setOnTouchListener(this);        tv_retrieve_password.setOnClickListener(this);        tv_register.setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.tv_left: // 返回                startExitActivity();                break;            case R.id.bt_login: // 登录                loginUser(); // 登陆                break;            case R.id.iv_login_username_del: { // 快速删除用户名                et_login_username.setText("");                iv_login_username_del.setVisibility(View.GONE);                break;            }            case R.id.iv_login_pwd_del: { // 快速删除密码                et_login_password.setText("");                iv_login_pwd_del.setVisibility(View.GONE);                break;            }            case R.id.tv_retrieve_password: { // 找回密码                // TODO:跳转到找回密码界面                break;            }            case R.id.tv_register: { // 注册         // startEnterActivity(RegisterActivity.class);                break;            }        }    }    /**     * 登陆     */    private void loginUser() {        if (!NetUtils.isNetworkConnected(getApplication())) {            showToastShort(R.string.network_is_not_available_check_your_network_link);            return;        }        String username = et_login_username.getText().toString().trim();        String password = et_login_password.getText().toString().trim();        if (isNull(username)) {            showToastShort(R.string.string_username_hint);            return;        }        if (!Utils.getInstance().isMobileNO(username)) {            showToastShort(R.string.toast_phone_error);            return;        }//        bt_login.setEnabled(false);        // TODO: 登录操作        startEnterActivity(MainActivity.class, true);    }    @Override    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {        switch (buttonView.getId()) {            case R.id.cb_remember_me: // 记住密码 ToggleButton状态                cb_remember_me.setTextColor(getResColor(                        cb_remember_me.isChecked() ? R.color.login_button_bg_color_normal                                : R.color.six_six));                putBoolean(KEY_IS_REMEMBER_ME, isChecked);                isAutoLogin = isChecked;                break;        }    }    @Override    public boolean onTouch(View v, MotionEvent event) {        i(TAG, "onTouch");        closeKeyboard();        return false;    }    @Override    public void onFocusChange(View v, boolean hasFocus) {        switch (v.getId()) {            case R.id.et_login_username: // 用户名输入框获得焦点                if (hasFocus && et_login_username.getText().toString().length() > 0) {                    iv_login_username_del.setVisibility(View.VISIBLE);                } else {                    iv_login_username_del.setVisibility(View.GONE);                }                break;            case R.id.et_login_password: // 密码输入框获得焦点                if (hasFocus && et_login_password.getText().toString().length() > 0) {                    iv_login_pwd_del.setVisibility(View.VISIBLE);                } else {                    iv_login_pwd_del.setVisibility(View.GONE);                }                break;        }    }    @Override    public boolean onKeyUp(int keyCode, KeyEvent event) {        if (keyCode == KeyEvent.KEYCODE_BACK) {            startExitActivity();            return true;        }        return super.onKeyUp(keyCode, event);    }}

3,源码地址:待上传
 
时间: 2024-10-06 04:17:06

Android MVP模式实现组件和业务逻辑分离的相关文章

Android MVP模式学习(二)----Data Binding结合

公司项目最近已经用MVP模式重新构造完成,重构后的项目直观明了,代码复用性高,易于调试维护. 之后主管让我去了解MVC,MVP ,MVVM,Data Binding相关的知识,于是便有了下面这篇博客.参考资料: 选择恐惧症的福音!教你认清MVC,MVP和MVVM 完全掌握Android Data Binding 这里很感谢这两篇文章的理论与技术支持,感谢这些大神. OK,开始今天的主题. 关于MVP模式与MVVM模式孰是孰非,我想不是我一个初学者短短几句就能够说清楚的,我们也不用纠结于此.引用大

4. PyQt5-实现显示和业务逻辑分离

Author: Notus([email protected]) Create: 2019-02-10 Update: 2019-02-10 PyQt5 实现显示和业务逻辑分离, 继承主界面文件的主窗口类 环境 操作系统: Windows 10 专业版 64-bit (10.0, Build 16299) (16299.rs3_release.170928-1534) Python Version: 3.7.1 PyQt5 Version: 5.11.3 Qt Designer Version:

android MVP模式简单介绍

原文 http://zhengxiaopeng.com/2015/02/06/Android%E4%B8%AD%E7%9A%84MVP/ 前言 MVP作为一种MVC的演化版本在Android开发中受到了越来越多的关注,但在项目开发中选择一种这样的软件设计模式需保持慎重心态,一旦确定 使用MVP作为你App的开发模式那么你就最好坚持做下去,如果在使用MVP模式开发过程中发现问题而且坑越来越大,这时你想用MVC等来重新设计的话基 本上就等于推倒重来了.要知道在Android上MVP在现在为止并没有统

Android MVP模式的初识

  MVP是什么?或许在之前更多的人知道的是MVC这个模式(Model View Controller),然而MVP与MVC最不同的一点是M与V是不直接 关联的也是就Model与View不存在直接关系,这两者之间间隔着的是Presenter层.个人感觉这是一种很棒的设计,让代码能够实现充分的解耦. 那么我们还是没有讲到MVP是什么~~~不要急,我会用最简单的方式来叙述,这样好理解~ M(Model):为UI层提供数据,或者是保存UI层的数据: V(View) :单纯的数据展示,响应用户的操作并且

Xamarin.Android MVP模式

一.简介 随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数 据的可视化以及与用户的交互,同时让Model只关系数据的处理,基于MVC概念的MVP(Model-View-Presenter)模式应运而生. 在MVP模式里通常包含4个要素: View:负责绘制UI元素.与用户进行交互(在Android中体现为Activity); View interface:需要View实现的接口,View通过View i

android MVP模式思考

在软件开发设计中,有多种软件设计模式,如web开发中经典的MVC, 将后台分为三层:Model层,View层和Controller层,其中,Model主要是数据处理,如数据库,文件,或网络数据等:View层是视图层,主要是指前端或后端用于直接展现给用户的页面,Controller层则是负责业务逻辑处理,即将Model中读取的数据显示到View层,同时又将View层触发的操作事件经过业务处理后将数据保存到Model层中. 在android中,可能很多开发者使用的还是mvc模式,比如,在代码中可以发

作为过来人,对于Android MVP模式的一些详解

前言 闲来无事在家偶然翻到了之前整理的文档和面试要做到准备路线,虽然内容有点多,但是技多不压身,多多益善 本部分内容是关于Android进阶的一些知识总结,涉及到的知识点比较杂,不过都 是面试中几乎常问的知识点,也是加分的点. 关于这部分内容,可能需要有一些具体的项目实践.在面试的过程中,结合具体自 身实践经历,才能更加深入透彻的描绘出来 相关内容后续GitHub更新,想冲击金三银四的小伙伴可以找找看看,欢迎star(顺手留下GitHub链接,需要获取相关面试等内容的可以自己去找)https:/

提示框的优化之自定义Toast组件之(二)Toast组件的业务逻辑实现

在java下org.socrates.mydiary.activity下LoginActivity下自定义一个方法showCustomerToast() ? 1 public class LoginActivity extends AppCompatActivity { 2 private void showCustomerToast(final int icon, final String message){ 3 LayoutInflater inflater=getLayoutInflate

关于Android MVP模式的思考

最近经常看到各种介绍MVP模式的博客的,之前写过不少的Android应用,在做那些应用的时候,都是要求快速完成,所以从开始设计到写代码就一直考虑着重用.以前写的项目基本都是不断重构项目,将项目代码变得更加精简,提高代码之间的复用性.但是代码并没有特别地注重按照MVC模式或者是MVP模式来,更多的是直接考虑模块化,重用,精简.所以看了MVP模式后,决定去总结一下自己代码中的问题并优化,算是对自己之前写的代码的回顾. MVP框架 MVP框架是目前在Android流行起来的框架,它非常适合用于Andr