零、前言
此篇为用kotlin实现的简单mvp设计模式,Demo功能是登录。通过此篇文章可以学习Kotlin语言基础使用,以及理解mvp设计模式。项目源码:KotlinAndroiMVP
壹、mvp简介
View层:负责视图操作 Model层:负责数据操作 Present层:管理数据,控制界面 其他详细介绍,请百度。
贰、Model数据层
model层用于处理登录数据的接口
interface LoginModell{
fun login(username:
String,password:
String,listener: OnLoginFinishListener)
}
处理登录事件的监听者
interface OnLoginFinishListener{
fun onUsernameError()
fun onPasswordError()
fun onSuccess()
}
model具体实现类,这里主要用来处理数据操作
class LoginModelImp : LoginModell {
override fun login(username:
String, password:
String, listener: OnLoginFinishListener) {
Handler().postDelayed(Runnable {
val
error: Boolean =
false
if (TextUtils.
isEmpty(username)) {
listener.onUsernameError()
Log.d(
"tttt",
";ddd"+username)
return@Runnable
}
if (TextUtils.
isEmpty(password)) {
listener.onPasswordError()
return@Runnable
}
if (!
error) {
listener.onSuccess()
}
},
2000)
}
}
}
叁、view接口层
LoginView里面设计的接口,主要用来处理登录的界面。登录时显示进度条,账号密码错误时的UI等
interface LoginView {
fun showProgress()
fun hideProcess()
fun setUsernameError()
fun setPasswordError()
fun navigateTohome()
}
肆、present层
present主要用来连接view层和数据层
interface LoginPresenter {
fun validateCredentials(username: String, password: String)
fun onDestoroy()
}
presentImp实现LoginPresenter和OnLoginFinishListener接口,并且以loginview作为关联对象。
class LoginPresentImp(loginview: LoginView) : LoginPresenter, OnLoginFinishListener {
lateinit var loginV: LoginView
var loginModel: LoginModell
init {
loginV = loginview
loginModel = LoginModelImp()
}
override fun validateCredentials(username: String, password: String) {
if (loginV != null) {
loginV.showProgress()
}
loginModel.login(username, password, this)
}
override fun onUsernameError() {
if (loginV != null) {
loginV.setUsernameError()
loginV.hideProcess()
}
}
override fun onPasswordError() {
if (loginV != null) {
loginV.setPasswordError()
loginV.hideProcess()
}
}
override fun onSuccess() {
if (loginV != null) {
loginV.navigateTohome()
loginV.hideProcess()
}
}
override fun onDestoroy() {
loginV != null
}
}
五、MainActivity实现
类实现Loginview,并且在实现方法中做了UI具体操作。
class MainActivity : AppCompatActivity(), LoginView {
lateinit var present: LoginPresenter
var name:String=
""
var word:String=
""
override fun onCreate(savedInstanceState: Bundle?) {
super
.onCreate(savedInstanceState)
setContentView(R
.layout.activity_main)
init()
}
fun init(){
progress
.visibility = View
.GONE
present = LoginPresentImp(this)
button
.setOnClickListener { view ->
name= username
.text.toString()
word= password
.text.toString()
present
.validateCredentials(name,word)
}
}
override fun showProgress() {
progress
.visibility = View
.VISIBLE
}
override fun hideProcess() {
progress
.visibility = View
.GONE
}
override fun setUsernameError() {
toast(
"请输入用户名",
0)
}
override fun setPasswordError() {
toast(
"请输入密码",
0)
}
override fun navigateTohome() {
toast(
"登陆成功",
1)
}
override fun onDestroy() {
present
.onDestoroy()
super
.onDestroy()
}
fun toast(message: String,time:Int) {
Toast
.makeText(this, message, time)
.show()
}