使用MVP控制Android中的可见性

问题描述 投票:0回答:2

我正在Android Studio中使用MVP设计模式构建计数器应用。我想在计数器的值为0时隐藏我的重置按钮,那么我应该将代码放在哪里以控制其可见性?我有以下课程:

MainActivity.kt

package com.example.mvpexample

import android.os.Bundle
import android.view.View
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import com.example.mvpexample.contract.ContractInterface
import com.example.mvpexample.databinding.ActivityMainBinding
import com.example.mvpexample.presenter.MainActivityPresenter

class MainActivity : AppCompatActivity(), ContractInterface.View {

    private lateinit var binding: ActivityMainBinding

    private var presenter: MainActivityPresenter? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        presenter = MainActivityPresenter(this)

    }

    override fun initView() {

        binding.increment.setOnClickListener { presenter?.incrementValue() }
        binding.decrement.setOnClickListener { presenter?.decrementValue() }
        binding.reset.setOnClickListener { presenter?.resetValue() }

    }

    override fun updateViewData() {
        binding.counter.text = presenter?.getCounter()
    }

    fun setButtonVisibility(isZero: Boolean, button: Button) {
        if (isZero) {
            button.visibility = View.GONE
        } else {
            button.visibility = View.VISIBLE
        }
    }
}

MainActivityPresenter.kt

package com.example.mvpexample.presenter

import com.example.mvpexample.contract.ContractInterface.*
import com.example.mvpexample.model.MainActivityModel

class MainActivityPresenter(_view: View) : Presenter {

    private var view: View = _view
    private var model: Model = MainActivityModel()

    init {
        view.initView()
    }

    override fun incrementValue() {
        model.incrementCounter()
        view.updateViewData()
    }

    override fun decrementValue() {
        model.decrementCounter()
        view.updateViewData()
    }

    override fun resetValue() {
        model.resetCounter()
        view.updateViewData()
    }

    override fun getCounter() = model.getCounter().toString()

}

MainActivityModel.kt

package com.example.mvpexample.model

import com.example.mvpexample.contract.ContractInterface.Model

class MainActivityModel : Model {

    private var mCounter = 0

    override fun getCounter() = mCounter

    override fun decrementCounter() {
        if (mCounter == 0)
            return
        mCounter--
    }

    override fun incrementCounter() {
        mCounter++
    }

    override fun resetCounter() {
        mCounter = 0
    }

}

ContractInterface.kt

package com.example.mvpexample.contract

import android.widget.Button

interface ContractInterface {

    interface View {
        fun initView()
        fun updateViewData()
    }

    interface Presenter {
        fun incrementValue()
        fun decrementValue()
        fun resetValue()
        fun getCounter(): String
    }

    interface Model {
        fun getCounter(): Int
        fun decrementCounter()
        fun incrementCounter()
        fun resetCounter()
    }

}
android android-studio kotlin mvp android-mvp
2个回答
0
投票

在您的ContractInterface中添加

fun showResetButton()
fun hideResetButton()

在演示者内部执行此操作,并在活动中调用函数。在MainActivity内修改函数,使showResetButton()hideResetButton()有趣,而不是setButtonVisibility

if else逻辑应尽可能位于Presenter中。


0
投票

通过在View接口中添加一个将计数器的值作为参数的函数来解决。

ContractInterface.kt

package com.example.mvpexample.contract

import android.widget.Button

interface ContractInterface {

    interface View {
        fun initView()
        fun displayResetButton(countValue: Int)
        fun updateViewData()
    }

    interface Presenter {
        fun incrementValue()
        fun decrementValue()
        fun resetValue()
        fun getCounter(): String
    }

    interface Model {
        fun getCounter(): Int
        fun decrementCounter()
        fun incrementCounter()
        fun resetCounter()
    }

}

MainActivity.kt

package com.example.mvpexample

import android.os.Bundle
import android.view.View
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import com.example.mvpexample.contract.ContractInterface
import com.example.mvpexample.databinding.ActivityMainBinding
import com.example.mvpexample.presenter.MainActivityPresenter

class MainActivity : AppCompatActivity(), ContractInterface.View {

    private lateinit var binding: ActivityMainBinding

    private var presenter: MainActivityPresenter? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        presenter = MainActivityPresenter(this)

    }

    override fun initView() {

        binding.increment.setOnClickListener { presenter?.incrementValue() }
        binding.decrement.setOnClickListener { presenter?.decrementValue() }
        binding.reset.setOnClickListener { presenter?.resetValue() }

    }

    override fun displayResetButton(countValue: Int) {
        if (countValue > 0) {
            binding.reset.visibility = View.VISIBLE
        } else {
            binding.reset.visibility = View.GONE
        }
    }


    override fun updateViewData() {
        binding.counter.text = presenter?.getCounter()
    }
}

MainActivityPresenter.kt

package com.example.mvpexample.presenter

import com.example.mvpexample.contract.ContractInterface.*
import com.example.mvpexample.model.MainActivityModel

class MainActivityPresenter(_view: View) : Presenter {

    private var view: View = _view
    private var model: Model = MainActivityModel()

    init {
        view.initView()
        view.displayResetButton(model.getCounter())
    }

    override fun incrementValue() {
        model.incrementCounter()
        view.displayResetButton(model.getCounter())
        view.updateViewData()
    }

    override fun decrementValue() {
        model.decrementCounter()
        view.displayResetButton(model.getCounter())
        view.updateViewData()
    }

    override fun resetValue() {
        model.resetCounter()
        view.displayResetButton(model.getCounter())
        view.updateViewData()
    }

    override fun getCounter() = model.getCounter().toString()

}
© www.soinside.com 2019 - 2024. All rights reserved.