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