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只 ...
随机推荐
- 【总结整理】json数据请求简化版理解(祺哥的成果)
在同源js目录下新建.txt文件 { "news":[ {"title":"审计管理","time":"201 ...
- Opencv中Rect_类
Rect_类有些意思,成员变量x.y.width.height,分别为左上角点的坐标和矩形的宽和高.常用的成员函数有Size()返回值为一个Size,area()返回矩形的面积,contains(Po ...
- iOS组件化方案
一.蘑菇街url-block方案 这是蘑菇街中应用的一种页面间调用的方式,通过在启动时注册组件提供的服务,把调用组件使用的url和组件提供的服务block对应起来,保存到内存中.在使用组件的服务时,通 ...
- Java50道经典习题-程序45 被9整除
题目:判断一个素数能被几个9整除分析:素数只能被1和其本身整除,不能被9整除,所以返回false import java.util.Scanner; public class Prog45{ publ ...
- c# ftp创建文件(非上传文件)
c# ftp创建文件(非上传文件) 一.奇葩的故事: 今天项目中遇到这么个奇葩的问题,ftp文件传输完成后要在ftp目录下另一个文件夹下创建对应的空文件,听说是为了文件的完整性,既然这么说,那么就必 ...
- javaweb访问hdfs的一些错误
javaweb 与 HDFS 坑 前提:javaweb 项目,hdfs中的数据文件,导入访问hdfs的jar包,eclipse调试 问题:在×××.java代码中正常访问hdfs,浏览jsp时调用×× ...
- thinkphp 连接数据库 & 实例化模型操作 (下接thinkphp CURD 操作)/慕课
7.1 连接数据库 (06:15) 1 7.2实例化模型 1 1.实例化基础模型 2 2. 实例化用户自定义模型 2 问题 2 3. 实例化公共模型 4 4. 实例化空模型 7 7.1 连接数据 ...
- FFT字符串匹配
本文半原创 参考资料:其实就是照抄的什么参考啊 我们知道KMP可以用来在线性复杂度内进行制胡窜匹配 今天教您一种新方法:用FFT进行字符串匹配 您可能觉得这很玄学,FFT不是做多项式卷积的吗,怎么还可 ...
- git 创建、切换和提交新分支
查看本地分支 git branch 创建新的分支 git branch <newBranch> 切换分支 git checkout <branchName> 创建并切换分支 g ...
- ArcGIS-各类问题
arcgis 10.4破解方法*注意!Desktop,Engine,Server必须为同一版本 1.先安装License10.4 2.再安装Desktop10.4 3.再安装Engine10.4 4. ...