Android Kotlin中的重用方法

时间:2018-12-16 13:29:07

标签: android android-activity kotlin

我需要从应用程序的多个不同位置打开一项活动。假设来自“设置”片段,“主要活动”和“导航”抽屉(片段)。我不想复制/粘贴相同的方法,并且该方法非常具体,应该完全相同(因为它注册了Firebase事件)。如何有效地构造代码?该方法放在哪里?一种想法是拥有一个仅包含方法的全局ActivityUtils.kt文件,并将其用于存储这些方法。我对替代方案以及每种方案的优缺点都感兴趣。

3 个答案:

答案 0 :(得分:1)

我会在您需要打开的活动中创建一个companion object

class YourActivity : AppCompatActivity() {

    companion object {
        fun start(ctx: Context) {
            // put your logic here (registering of Firebase events)

            val i = Intent(ctx, YourActivity::class.java)
            ctx.startActivity(i)
         }
    }
}

并从另一个活动中调用它:

YourActivity.start(this)

或来自另一个片段:

YourActivity.start(context)

答案 1 :(得分:0)

使用扩展方法:

fun Activity.doMyStuff() {}

可以从任何扩展Activity的类中调用它:

doMyStuff()

这样的扩展功能不应放在类中,而应放在文件中。因此,如果要制作一个ActivityUtils.kt文件,则其中没有任何class ActivityUtils {}的东西。函数应该直接进入文件。

答案 2 :(得分:0)

为什么不使用MVP? 就像

interface IView { 
    val context: Context 
}

interface IPresenter { 
    fun launchActivity(view: IView) 
}

class MyActivityModel
{
    var key = "key"
    /*some other data*/

    fun getParcelableObject(): Parcelable
    {
        return /*some parcelable from model data*/
    }
}

class MyActivity : AppCompatActivity(), IView
{
    override val context: Context
        get() = this
}

class MyActivityPresenter() : IPresenter
{
    private var model: MyActivityModel = MyActivityModel()

    override fun launchActivity(view: IView)
    {
        val intent = Intent(view.context, MyActivity::class.java)
        intent.putExtra(model.key, model.getParcelableObject())
        view.context.startActivity(intent)
    }

    fun setSomeDataToModel(someData: Any) {

    }
}

/*Everyone who wants to use presenter, must be a Context and implement IView*/
fun use()//in some fragment, or activity implementing IView
{
    MyActivityPresenter().launchActivity(this)
    //or
    val presenter = MyActivityPresenter()
    presenter.setSomeDataToModel("some data")
    presenter.launchActivity(this)
}