最近学习了一下MVP模式。
我自己的理解是:
M:model 数据的处理:网络请求,读写文件等;
V:view 界面处理:Toast,EditText获取,界面跳转等;
P:presenter 协调V和M,调用M拿到数据,再调用View显示出对用的界面。
上代码:首先是目录
然后看看具体代码:
ILoginModel
package com.antiandi.android.mvpdemo.kotlin.mvp.model.imodel
/**
* Created by wk on 2017/6/6.
*/
interface ILoginModel {
fun login(userName : String,password : String,onLoginListener: OnLoginListener) : Unit
}
package com.antiandi.android.mvpdemo.kotlin.mvp.model.mod
import com.antiandi.android.mvpdemo.kotlin.mvp.model.imodel.ILoginModel
import com.antiandi.android.mvpdemo.kotlin.mvp.model.imodel.OnLoginListener
/**
* Created by wk on 2017/6/6.
*/
class LoginModel : ILoginModel {
companion object{
private var mLoginModel : LoginModel ?= null
fun newInstance() : LoginModel?{
if (mLoginModel == null) mLoginModel = LoginModel()
return mLoginModel
}
}
override fun login(userName: String, password: String, onLoginListener: OnLoginListener) {
if ("zhangsan" != userName) {
onLoginListener.onUserNameError()
return
}
if ("123" != password) {
onLoginListener.onPasswordError()
return
}
onLoginListener.onSuccess()
}
}
ILoginListener:
package com.antiandi.android.mvpdemo.kotlin.mvp.model.imodel
/**
* Created by wk on 2017/6/6.
*/
interface OnLoginListener {
fun onUserNameError() : Unit
fun onPasswordError() : Unit
fun onSuccess() : Unit
fun onError() : Unit
}
ILoginPresenter:
package com.antiandi.android.mvpdemo.kotlin.mvp.presenter.ipresenter
/**
* Created by user on 2017/6/6.
*/
interface ILoginPresenter {
fun login() : Unit
}
LoginPresenter:
package com.antiandi.android.mvpdemo.kotlin.mvp.presenter.compl
import com.antiandi.android.mvpdemo.kotlin.mvp.model.imodel.ILoginModel
import com.antiandi.android.mvpdemo.kotlin.mvp.model.imodel.OnLoginListener
import com.antiandi.android.mvpdemo.kotlin.mvp.model.mod.LoginModel
import com.antiandi.android.mvpdemo.kotlin.mvp.presenter.ipresenter.ILoginPresenter
import com.antiandi.android.mvpdemo.kotlin.mvp.view.iview.ILoginView
/**
* Created by wk on 2017/6/6.
*/
class LoginPresenter(var mView : ILoginView,var mModel : ILoginModel ?) : ILoginPresenter , OnLoginListener{
// var mView : ILoginView ?= null
// var mModel : ILoginModel ?= LoginModel()
override fun login() {
var userName : String = mView!!.getUserName()
var password : String = mView!!.getPassword()
this.mModel!!.login(userName,password,this@LoginPresenter)
}
override fun onUserNameError() {
mView!!.showToast("onUserNameError--->")
}
override fun onPasswordError() {
mView!!.showToast("onPasswordError--->")
}
override fun onSuccess() {
mView!!.showToast("onSuccess--->")
mView!!.gotoMainActivity()
}
override fun onError() {
mView!!.showToast("onError--->")
}
}
ILoginView:
package com.antiandi.android.mvpdemo.kotlin.mvp.view.iview
/**
* Created by wk on 2017/6/6.
*/
interface ILoginView {
fun getUserName() : String
fun getPassword() : String
fun showToast(msg : String) : Unit
fun gotoMainActivity() : Unit
}
LoginActivity:
package com.antiandi.android.mvpdemo.kotlin.mvp.view.activity
import android.content.Intent
import android.graphics.Color
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.Gravity
import android.view.View
import android.widget.EditText
import android.widget.LinearLayout
import android.widget.Toast
import com.antiandi.android.mvpdemo.MainActivity
import com.antiandi.android.mvpdemo.R
import com.antiandi.android.mvpdemo.kotlin.mvp.model.mod.LoginModel
import com.antiandi.android.mvpdemo.kotlin.mvp.presenter.compl.LoginPresenter
import com.antiandi.android.mvpdemo.kotlin.mvp.presenter.ipresenter.ILoginPresenter
import com.antiandi.android.mvpdemo.kotlin.mvp.view.iview.ILoginView
import org.jetbrains.anko.*
/**
* Created by wk on 2017/6/6.
*/
class LoginActivity : AppCompatActivity() ,ILoginView{
var mPresenter : LoginPresenter = LoginPresenter(this@LoginActivity,LoginModel.newInstance())
var mUI : UI = UI()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mUI.setContentView(this@LoginActivity)
// mPresenter.mView = this@LoginActivity
}
override fun getUserName(): String {
return mUI.etUserName!!.text.toString()
}
override fun getPassword(): String {
return mUI.etPassword!!.text.toString()
}
override fun showToast(msg: String) {
toast(msg)
}
override fun gotoMainActivity() {
startActivity(Intent(this@LoginActivity,MainActivity::class.java))
}
inner class UI : AnkoComponent<LoginActivity> {
var etUserName : EditText ?= null
var etPassword : EditText ?= null
override fun createView(ui: AnkoContext<LoginActivity>): View {
return with(ui){
linearLayout {
lparams {
width = matchParent
height = wrapContent
orientation = LinearLayout.VERTICAL
}
etUserName = editText {
hint = "账号"
hintTextColor = Color.GRAY
lparams {
width = matchParent
height = wrapContent
margin = dip(50)
}
}
etPassword = editText {
hint = "密码"
hintTextColor = Color.GRAY
lparams {
width = matchParent
height = wrapContent
margin = dip(50)
}
}
button ("登录"){
onClick {
mPresenter.login()
}
lparams {
width = wrapContent
height = wrapContent
margin = dip(10)
setHorizontalGravity(Gravity.CENTER)
}
}
}
}
}
}
}
好啦,代码结束,自己觉得有争议的就是
1、LoginActivity里面Presenter的创建方式,觉得Presenter的构造方法可以是无参的,然后提供setView()方法将View注入到Presenter中。然后Model直接在Presenter里面创建即可。
2、LoginActivty里面的确定按钮的点击事件应该调用View本身的view.login(),然后在login()方法中去调用mPresenter.login(),这样会使IView中的接口更加统一。
关于kotlin的学习是偷偷摸摸学的,忘记了做记录。以后学习新的东西应该及时的记录下来,以免以后忘记。