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. HotSpot JVM垃圾收集器

    HotSpot JVM收集器 上面有7中收集器,分为两块,上面为新生代收集器,下面是老年代收集器.如果两个收集器之间存在连线,就说明它们可以搭配使用. Serial(串行GC)收集器 Serial收集 ...

  2. 使用自定义线程池优化EchoServer

    在上一篇文章中http://www.cnblogs.com/gosaint/p/8494423.html 我自定义了线程池ThreadPool.现在在我的EchoServer中使用自定义线程池去负责和 ...

  3. Call requires API level 7 (current min is 1):(问题解决)

    在一个导入的项目里修改加入webView的时候设置缩放属性的设置报错: Call requires API level 7 (current min is 1): android.webkit.Web ...

  4. set源码之心得

    C++的STL很强大,强大到我只愿慵懒地去使用而不知其所以然.直到李师问我,我的回答被李师否定,我方才意识到自己是多么地浅陋.希望自己有空抽时间把STL源码给研究一下,化为自己真正可以掌控的力量. s ...

  5. C#简单的图片合成及防止并发的办法

    /// <summary> /// 合成图 /// </summary> private string ComposeCarBrandBadImage(AnonAttachme ...

  6. Condition实现一个生产者一个消费者

    Condition实现一个生产者一个消费者,实现一对一交替打印: import java.util.concurrent.locks.Condition; import java.util.concu ...

  7. Tensorflow手写数字识别训练(梯度下降法)

    # coding: utf-8 import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data #p ...

  8. loj10102 旅游航道

    传送门 分析 一道喜闻乐见的求桥的板子题. 代码 #include<iostream> #include<cstdio> #include<cstring> #in ...

  9. CH 4302 Interval GCD

    辗转相减法的扩展 $gcd(x, y, z) = gcd(x, y - x, z - y)$ 当有n个数时也成立 所以构造$a_{i}$的差分数组$b_{i} = a_{i} - a_{i - 1}$ ...

  10. linux环境安装python

    linux环境下安装python3,一步一步来吧! 安装python3 安装readline-devel依赖 ,用于解决python3安装完成后,退格和方向键乱码问题 yum install read ...