MVP是一种设计模式,将项目分为Model、View、Presenter三个模块,利用中间层Presenter完成View层与Model层的数据交互。
以下是各层的功能:
1.Model层:业务逻辑和实体模型。
2.View层:对应Activity,负责View的绘制以及与用户交互。
3.Presenter层:负责完成View与Model层的交互。
Model层
OnLoginFinishedListener.kt
package linchange.com.kotlinmvp.model
/**
* Created by lkmc2 on 2018/2/28.
* 登陆结束监听器
*/
interface OnLoginFinishedListener {
fun onUsernameError() //用户名输入错误
fun onPasswordError() //密码输入错误
fun onSuccess() //登陆成功
}
LoginModel.kt
package linchange.com.kotlinmvp.model
/**
* Created by lkmc2 on 2018/2/28.
* 登陆模型(Model层)
*/
interface LoginModel {
/**
* 登陆
* @param username 用户名
* @param password 密码
* @param listener 登陆结束监听器
*/
fun login(username: String, password: String, listener: OnLoginFinishedListener)
}
LoginModelImpl.kt
package linchange.com.kotlinmvp.model
import android.os.Handler
import android.text.TextUtils
/**
* Created by lkmc2 on 2018/2/28.
* 登陆模型实现类(延迟2秒后登陆,用户名和密码非空则登陆成功)
*/
class LoginModelImpl : LoginModel {
override fun login(username: String, password: String, listener: OnLoginFinishedListener) {
Handler().postDelayed({
var error = false //登陆失败标记
if (TextUtils.isEmpty(username)) { //用户名为空
listener.onUsernameError() //用户名输入错误
error = true
}
if (TextUtils.isEmpty(password)) { //密码为空
listener.onPasswordError() //密码输入错误
error = true
}
if (!error) {
listener.onSuccess() //登陆成功
}
}, 2000)
}
}
View层
LoginView.kt
package linchange.com.kotlinmvp.view
/**
* Created by lkmc2 on 2018/2/28.
* 登陆界面接口(View层)
*/
interface LoginView {
fun showProgress() //展示进度条
fun hideProgress() //隐藏进度条
fun setUsernameError() //设置用户名错误
fun setPasswordError() //设置密码错误
fun navigateToHome() //导航到桌面
}
MainActivity.kt
package linchange.com.kotlinmvp
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import kotlinx.android.synthetic.main.activity_main.*
import linchange.com.kotlinmvp.presenter.LoginPresenter
import linchange.com.kotlinmvp.presenter.LoginPresenterImpl
import linchange.com.kotlinmvp.view.LoginView
import org.jetbrains.anko.toast
/**
* 主界面Activity(View层)
*/
class MainActivity : AppCompatActivity(),
LoginView, View.OnClickListener { //实现Login和OnClickListener接口
private lateinit var presenter: LoginPresenter //登陆Presenter(延迟初始化)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener(this) //为按钮设置点击事件监听器
presenter = LoginPresenterImpl(this) //初始化presenter
}
override fun showProgress() {
progress.visibility = View.VISIBLE //显示进度条
}
override fun hideProgress() {
progress.visibility = View.GONE //隐藏进度条
}
override fun setUsernameError() {
username.error = "用户名错误" //给用户名输入框设置错误信息
}
override fun setPasswordError() {
password.error = "密码错误" //给密码输入框设置错误信息
}
override fun navigateToHome() {
toast("登陆成功") //提示登陆成功
}
override fun onClick(v: View?) {
//验证用户信息
presenter.validateUserInfo(username.text.toString(), password.text.toString())
}
}
Presenter层
LoginPresenter.kt
package linchange.com.kotlinmvp.presenter
/**
* Created by lkmc2 on 2018/2/28.
* 登陆Presenter(Presenter层)
*/
interface LoginPresenter {
/**
* 验证用户信息
* @param username
* @param password
*/
fun validateUserInfo(username:String,password:String)
fun onDestroy() //销毁view
}
LoginPresenterImpl.kt
package linchange.com.kotlinmvp.presenter
import linchange.com.kotlinmvp.model.LoginModel
import linchange.com.kotlinmvp.model.LoginModelImpl
import linchange.com.kotlinmvp.model.OnLoginFinishedListener
import linchange.com.kotlinmvp.view.LoginView
/**
* Created by lkmc2 on 2018/2/28.
* 登陆Presenter实现类
*/
class LoginPresenterImpl(private var loginView: LoginView?) : LoginPresenter, OnLoginFinishedListener {
//loginView是登陆界面
private val loginModel : LoginModel //登陆模型
init {
this.loginModel = LoginModelImpl() //实例化登陆模型
}
override fun validateUserInfo(username: String, password: String) {
loginView?.showProgress() //显示进度条
loginModel.login(username,password, this) //使用用户名和密码登陆
}
override fun onDestroy() {
this.loginView = null //销毁登陆界面
}
override fun onUsernameError() {
loginView?.apply { //登陆界面非空,操作loginView中的方法
setUsernameError() //设置用户名错误
hideProgress() //隐藏进度条
}
}
override fun onPasswordError() {
loginView?.apply { //登陆界面非空,操作loginView中的方法
setPasswordError() //设置密码错误
hideProgress() //隐藏进度条
}
}
override fun onSuccess() {
loginView?.apply { //登陆界面非空,操作loginView中的方法
navigateToHome() //回到主界面
hideProgress() //隐藏进度条
}
}
}
登陆失败运行截图.png
登陆成功运行截图.png
网友评论