MVPとは?
Androidアーキテクチャの一つ。
ActivityやFragmentで行っていた処理を以下の三つの役割に分ける。
・Model(データに関する処理を行う)
・View(画面に関する処理、クリック等のイベントを拾ってPresenterに送る処理を行う)
・Presenter(Viewからイベントを受け取り、Modelを操作したり、Viewに伝え画面操作を行うロジカルな処理を行う)
[メリット]
・Activity,Fragmentの肥大化を防げる。
・テストがしやすい。
実装内容
Presenterまで実装する。
EditTextに文字を入力してボタンを押したら、下部のTextViewに表示させる(超簡単)。
実装
[レイアウト]
①editText
②button
③textView
[コード]
・準備
①BasePresenter,BaseViewを作成。
interface BasePresenter {
//起動処理のメソッド
fun start()
}
interface BaseView<T> {
var presenter: T
}
・Contract設定
※Contractの役割はViewとPresenterを橋渡し、双方で使用するメソッドを定義する。
①Contractを作成。
②interface Viewとinterface Presenterを作成(戻り値にBasePresenter、BasePresenterを追加)。
③viewとpresenterで使用するメソッドを作成。
interface MainContract {
interface View: BaseView<Presenter> {
//③textViewをテキストを表示するメソッド
fun showTextView (text: String)
}
interface Presenter: BasePresenter {
//③Butoonをクリックされた際に使用するメソッド
fun onClickButton(text: String)
}
}
・Presenter設定
①Presenter作成。
②Contract.View(MainContract.View)を引数に追加。
③Contract.presenter(MainContract.Presenter)を戻り値に追加。
④view.presenter = thisに設定(view側で設定しないと出来ないかもしれない)。
⑤Contractで作成したメソッドが色々出てくるので設定。
class MainPresenter(private val view: MainContract.View): MainContract.Presenter {
//④view.presenter = thisに設定
init {
view.presenter = this
}
//⑤起動処理
override fun start() {
}
//⑤ボタンが押された時の処理
override fun onClickButton(text: String) {
view.showTextView(text)
}
}
・View設定
①View(Activity、Fragment)の戻り値にContract.View(MainContract.View)を追加。
②overrideしたContract.presenter(MainContract.Presenter)を追加。
③起動時にpresenterをインスタンス化。
④Contractで作成したメソッドが色々出てくるので設定(showTextView())。
⑤presenterのメソッドを呼び出す
class MainFragment: Fragment(),MainContract.View {
//②overrideしたContract.presenter(MainContract.Presenter)を追加。
override lateinit var presenter: MainContract.Presenter
lateinit var editText :EditText
lateinit var button :Button
lateinit var textView :TextView
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_main, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
editText = view.findViewById<EditText>(R.id.editTextText)
button = view.findViewById<Button>(R.id.button)
textView = view.findViewById<TextView>(R.id.textView)
//③起動時にpresenterをインスタンス化
initPresenter()
//⑤presenter.startを呼び出す。
presenter.start()
button.setOnClickListener{
//⑤presenter.onClickButtonを呼び出す。
presenter.onClickButton(editText.text.toString())
}
}
//④TextViewに文字を表示させる
override fun showTextView(text: String) {
textView.text = text
}
fun initPresenter() {
if (::presenter.isInitialized) {
return
}
presenter = MainPresenter(this)
}
}
以上、Presenterの実装でした。
関連記事
【kotlin】超簡単なMVPを実装してみた、②LocalRepository設定(ローカルデータに保存、読み込み)
【kotlin】超簡単なMVPを実装してみた、③RemoteRepository設定(APIのやり取り)