MVP模式学习———登陆例子
来源:互联网 发布:矩阵分解含义 编辑:程序博客网 时间:2024/05/18 02:44
MVP模式学习———登陆例子
Activity中存放 Presenter 的引用,Presenter 中存放 View 和 Model 的引用
View 层
- 全部View接口的父类
View
- 全部View接口的父类
public interface View{ //需要在onCreate()方法中写的代码都在此方法中实现 void initView(); //获取上下文参数 Context getContext(); //提示Toast void showToast(String text);}
- 创建登陆用的LoginView
public interface LoginView extends View { //获取输入框内的用户名和密码 String getUsernameEtText(); String getPasswordEtText(); //跳转 void skipToMainActivity(); void skipToRegisterActivity(); void skipToForgetPwdActivity();}
Model 层
- 全部model接口的父类
Model
- 全部model接口的父类
public interface Model{}
- 创建 bean类
User.class
包含 username 、password 字段以及set、get方法。 - 创建登陆用的
LoginModel
public interface LoginModel extends Model{ //创建user逻辑 User buildUser(String username,String password); //登陆逻辑 boolean doLogin(Context context,User user);}
- 创建实现类
LoginModelImpl
public class LoginModelImpl implements LoginModel{ //创建用户对象 User buildUser(String username,String password){ User user=new User(); user.setUsername(username); user.setPassword(passwrod); return user; } //登陆逻辑 boolean doLogin(Context context,User user){ String username=user.getUsername(); String password=user.getPassword(); if("123456".equals(username)&&"654321".equals(password)){ return true; } else{ reture false; } }}
Presenter 层
1.创建接口类Presenter
public interface Presenter{ //在Activity和Fragment中调用的方法 void onCreate();}
- 创建抽象类
AbsPresenter
,利用泛型,持有Model 和 View 层的引用
public abstract class AbsPresenter<V extends View,M extends Model> implements Presenter{ protected V mView; protected M mModel; //构造方法 public AbsPresenter(View mView){ this.mView=(V)mView; } @Override public void onCreate(){ if(mView!=null){ mView.initView(); } }}
- 创建实现类
LoginPresenter
,继承自AbsPresenter
public class LoginPresenter extends AbsPresenter<LoginView,LoginModel>{ private LoginPresenter(View mView){ super(mView); mModel=new LoginModelImpl(); } public static LoginPresenter build(View mView){ return new LoginPresenter(mView); } /** * 以下为Activity中要进行的方法 */ public void skipToMainActivity(){ mView.skipToMainActivity(); } public void skipToRegisterActivity(){ mView.skipToRegisterActivity(); } public void skipToForgetPwdActiivty(){ mView.skipToForgetPwdActivity(); } public void clickDoLogin(){ if(mView==null||mModel==null) return; String username=mView.getUsernameEtText(); String password=mView.getPasswordEtText(); if(!checkInput(username,password)) return; User user=mModel.buildUser(username,password); boolean result=mModel.doLogin(mView.getContext(),user); if(result){ mView.showToast("登陆成功"); }else{ mView.showToast("登陆失败"); } } private boolean checkInput(String username,String password){ if(TextUtil.isEmpty(username)){ mView.showToast("用户名不能为空"); return false; }else if(TextUtil.isEmpty(password)){ mView.showToast("密码不能为空"); return false; } return true; }}
Activity 部分
- 创建所有 Activity 父抽象类
BaseActivity
,持有 AbsPresenter 的引用
- 创建所有 Activity 父抽象类
pulic abstract class BaseActivity<P extends AbsPresenter> extends AppCompatActivity implements View.OnClickListener{ protected final String TAG=getClass().getName(); protected P mPresenter; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(getContentViewId()); mPresenter=buildPresenter(); if(mPresenter!=null){ mPresenter.onCreate(); } } //设置布局 protected abstract int getContentViewId(); //获取Presenter protected abstract P buildPresenter(); @Override public void onClick(View view){ widgetClick(view); } //控件的click都在此实现 public abstract void widgetClick(View view); protected void toast(String text){ Toast.makeText(getApplicationContext(),text,Toast.LENGTH_SHORT).show(); }}
2.创建 LoginActivity
public class LoginActivity extends BaseActivity<LoginPresenter> implements LoginView{ private EditText mUsernameEt; private EditText mPasswordEt; private Button mLoginBtn; private Button mRegisterBtn; private Button mForgetPwdBtn; @Override protected int getContentViewId(){ return R.layout.activity_login; } @Override protected LoginPresenter buildPresenter(){ return LoginPresenter.build(this); } @Override public void initView() { mUsernameEt= (EditText) findViewById(R.id.username_et); mPasswordEt= (EditText) findViewById(R.id.password_et); mLoginBtn= (Button) findViewById(R.id.login_btn); mRegisterBtn= (Button) findViewById(R.id.register_btn); mForgetPwdBtn= (Button) findViewById(R.id.forgetPwd_btn); mLoginBtn.setOnClickListener(this); mRegisterBtn.setOnClickListener(this); mForgetPwdBtn.setOnClickListener(this); } @Override public void widgetClick(View view) { switch(view.getId()){ case R.id.login_btn: mPresenter.clickDoLogin(); break; case R.id.register_btn: mPresenter.skipToRegisterActivity(); break; case R.id.forgetPwd_btn: mPresenter.skipToForgetPwdActivity(); break; } } @Override public String getUsernameEtText() { return mUsernameEt.getText().toString(); } @Override public String getPasswordEtText() { return mPasswordEt.getText().toString(); } @Override public void skipToMainActivity() {} @Override public void skipToRegisterActivity() {} @Override public void skipToForgetPwdActivity() {} @Override public Context getContext() { return getApplicationContext(); } @Override public void showToast(String text) { toast(text); }}
第一次写博客,也是第一次用 markdown 排版,有不足之处还请谅解。代码部分是借鉴了别人的代码,并加上了自己的理解。如果有问题,请大佬们指正。
0 0
- MVP模式学习———登陆例子
- 通过用户登陆例子来学习MVP模式
- MVP模式—徐旸
- android 使用MVP模式完成一个小demo——登陆
- Android MVC,MVP,MVVM模式入门——重构登陆注册功能
- mvp模式的登陆
- Android入门学习——Retrofit+MVP模式学习
- MVP模式最佳实践(1)—MVP模式简介
- android学习笔记——MVP模式介绍
- 设计模式——MVP
- Android:MVP模式例子
- Android MVP模式例子
- MVP模式实现接口登陆
- Andriod——MVP网络获取登陆注册
- 开发模式——MVP框架开发
- 初识android设计模式—MVP
- jsp—MySql制作B/s登陆的好例子 学习笔记
- FanChat学习笔记(一)——MVP模式的应用
- leetcode349: Intersection of Two Arrays
- codeforces-337【C思维,贪心】
- 洛谷1120小木棍
- JQuery技术初探之二级联动的设计与实现
- 搬家送书咯!
- MVP模式学习———登陆例子
- TFT-LCD驱动程序设计(系列一)
- 第6节--python数据类型--string
- stm32学习的日子-构建库函数雏形(第1节)—寄存器结构体定义控制点亮G0Kitv2.1 LED2和LED4
- JavaScript树形下拉框
- LED驱动及其测试
- 属性动画的基本实现
- J2EE之反射中的class类(二)
- android传感器2--指南针