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,源码地址:待上传
 

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

  1. Android MVP模式

    转自http://segmentfault.com/blogs,转载请注明出处Android MVP Pattern Android MVP模式\[1\]也不是什么新鲜的东西了,我在自己的项目里也普遍 ...

  2. android MVP模式介绍与实战

    android MVP模式介绍与实战 描述 MVP模式是什么?MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数 ...

  3. Android MVP模式简单易懂的介绍方式 (三)

    Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 讲完M和P,接下来就要讲V了.View ...

  4. Android MVP模式简单易懂的介绍方式 (二)

    Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 上一篇文章我们介绍完了Model的创建 ...

  5. Android MVP模式简单易懂的介绍方式 (一)

    Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 最近正在研究Android的MVP模式 ...

  6. Android MVP模式 简单易懂的介绍方式

    主要学习这位大神的博客:简而易懂 Android MVP模式 简单易懂的介绍方式 https://segmentfault.com/a/1190000003927200

  7. Android MVP模式 谷歌官方代码解读

    Google官方MVP Sample代码解读 关于Android程序的构架, 当前(2016.10)最流行的模式即为MVP模式, Google官方提供了Sample代码来展示这种模式的用法. Repo ...

  8. Android mvp模式、mvvm模式

    MVC和MVP的区别2007年08月08日 星期三 上午 09:23 MVC和MVP到底有什么区别呢? 从这幅图可以看到,我们可以看到在MVC里,View是可以直接访问Model的!从而,View里会 ...

  9. Xamarin.Android MVP模式

    一.简介 随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数 据的可视化以及与用户的交互,同时让Model只 ...

随机推荐

  1. Java知识点总结1

    1.java的引用传递和值传递 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java 编程语言只有值传递参 ...

  2. 单选与复选控件JRadioButton与JCheckBox的使用

    -----------------siwuxie095 工程名:TestUI 包名:com.siwuxie095.ui 类名:TestTextFieldAndTextArea.java 工程结构目录如 ...

  3. cocos2dx中的Rapidjson

    1 Json基础 JSON 概念和特点: JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式,类似 XML ...

  4. 【摘自张宴的"实战:Nginx"】使用nginx的proxy_cache模块替代squid,缓存静态文件

    #user nobody;worker_processes 1; error_log logs/static_source.error.log;#error_log logs/error.log no ...

  5. linux 开启终端256色支持

    一.简介 一般的Linux发行版默认的终端都是16色的,但事实上几乎所有的终端都支持256色终端.本文介绍开启终端256色支持的方法. 二.操作步骤 1)检查终端是否支持256色 http://www ...

  6. poj3171 Cleaning Shifts

    传送门 题目大意 有一个大区间和n个小区间,每个小区间都有一个代价,求最少付出多少代价可以使得小区间完全覆盖大区间. 分析为了方便起见我们先将s变为2,其它的位置都对应更改以便后期处理.我们考虑以t1 ...

  7. Luogu 2322 [HNOI2006]最短母串问题

    唔,太菜了,弄了好几个小时. 状压dp,设$f_{s, i}$表示选了集合$s$,以$i$结尾的最短长度,设$g_{i, j}$表示串$i$的后缀和串$j$的前缀的最长匹配长度. $f_{s, i} ...

  8. php数据连接

    <?php header("Content-type: text/html;charset=utf-8");//设置编码格式为UTF-8 error_reporting(E_ ...

  9. Java基础-集合框架-ArrayList源码分析

    一.JDK中ArrayList是如何实现的 1.先看下ArrayList从上而下的层次图: 说明: 从图中可以看出,ArrayList只是最下层的实现类,集合的规则和扩展都是AbstractList. ...

  10. MySQL数据库简介

    数据库就是数据的集合. 关系数据库是一种特殊的数据库,它将数据组织成表,并表示为表之间的关系. 数据库系统往往是大型项目的核心数据内容,如银行的用户账户信息.腾讯的QQ用户账户信息.股市的各种交易信息 ...