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,源码地址:待上传
Android MVP模式实现组件和业务逻辑分离的更多相关文章
- Android MVP模式
转自http://segmentfault.com/blogs,转载请注明出处Android MVP Pattern Android MVP模式\[1\]也不是什么新鲜的东西了,我在自己的项目里也普遍 ...
- android MVP模式介绍与实战
android MVP模式介绍与实战 描述 MVP模式是什么?MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数 ...
- Android MVP模式简单易懂的介绍方式 (三)
Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 讲完M和P,接下来就要讲V了.View ...
- Android MVP模式简单易懂的介绍方式 (二)
Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 上一篇文章我们介绍完了Model的创建 ...
- Android MVP模式简单易懂的介绍方式 (一)
Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 最近正在研究Android的MVP模式 ...
- Android MVP模式 简单易懂的介绍方式
主要学习这位大神的博客:简而易懂 Android MVP模式 简单易懂的介绍方式 https://segmentfault.com/a/1190000003927200
- Android MVP模式 谷歌官方代码解读
Google官方MVP Sample代码解读 关于Android程序的构架, 当前(2016.10)最流行的模式即为MVP模式, Google官方提供了Sample代码来展示这种模式的用法. Repo ...
- Android mvp模式、mvvm模式
MVC和MVP的区别2007年08月08日 星期三 上午 09:23 MVC和MVP到底有什么区别呢? 从这幅图可以看到,我们可以看到在MVC里,View是可以直接访问Model的!从而,View里会 ...
- Xamarin.Android MVP模式
一.简介 随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数 据的可视化以及与用户的交互,同时让Model只 ...
随机推荐
- LinkedHashMap和HashMap的区别
一.问题描述: 前几天写webservices接口,需要同步人力资源,涉及到添加顺序:主账号需要添加在次账号之前,直接上级需要添加在下级之前.解析xml之后直接封装在HashMap中,导致取对象时顺序 ...
- 每天一道算法题(15)——打印1到最大的n位数
题目: 打印1到最大的n位数.如n=4,打印1-9999. 思路: 由于直接使用循环会导致int或者long long都不够存储.因此使用字符串来存储数据,这里涉及到数字转换成字符串以及字符串的加法. ...
- 【总结整理】WebGIS基础
1.万维网:www是world wide web的简称是在超文本基础上形成的信息网 2.互联网:即广域局域网及单机按照一定的通讯协议组成的国际计算机网络 3.WebGIS:网络地理信息系统,指基于In ...
- Java线程池拒绝策略
Java线程池拒绝策略 相关资料: 线程池的RejectedExecutionHandler(拒绝策略):http://blog.csdn.net/jgteng/article/details/544 ...
- ROS Learning-022 learning_tf-06(编程) 现在与过去中穿梭 (Python版) --- waitForTransformFull() 函数
ROS Indigo learning_tf-06 现在与过去中穿梭 (Python版) - waitForTransformFull() 函数 我使用的虚拟机软件:VMware Workstatio ...
- ROS Learning-003 beginner_Tutorials 创建ROS工作空间
ROS Indigo beginner_Tutorials-02 创建ROS工作空间 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14.04. ...
- Luogu 3466 [POI2008]KLO-Building blocks
BZOJ 1112. 题意相当于在一个长度为$k$的区间内选择一个数$s$使$\sum_{i = 1}^{k}\left | a_i - s \right |$最小. 很显然是中位数. 然后只要写一个 ...
- beforeFilter()
在控制器每个动作之前执行,可以方便地检查有效的会话,或者检查用户的权限. function beforeFilter() { parent::beforeFilter(); if(empty($thi ...
- 自定义select样式
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Ping命令的设计与实现
ping命令的设计与实现 发表于 C++ Socket TCP/IP 2016-05-15 19:07 字数: 10796 阅读量: 528 ping 命令使用的相关 TCP/IP 协议 ping 命 ...