Kotlin扩展功能通过Intent Extras开始活动

Sak*_*ana 4 android kotlin kotlin-android-extensions

我正在尝试为上下文编写一个kotlin扩展函数,它将使用给定的类名和意图附加列表在android中启动新的活动。我能够成功地开始活动而没有任何额外的东西,但是我面临着他们的问题。

fun <T> Context.openActivity(it: Class<T>, pairs: List<Pair<String, Any>>) {
  var intent = Intent()
  pairs.forEach {
     intent.putExtra(it.first, it.second)
  }
  startActivity(intent)
}
Run Code Online (Sandbox Code Playgroud)

这里的主要问题是-> intent.putExtra()不会将第二个参数设为Any

Wil*_*ran 14

宣布:

inline fun <reified T : Activity> Context.startActivity(block: Intent.() -> Unit = {}) {
    startActivity(Intent(this, T::class.java).apply(block))
}
Run Code Online (Sandbox Code Playgroud)

简单使用:

startActivity<MainActivity>()
Run Code Online (Sandbox Code Playgroud)

有额外的

startActivity<MainActivity>{
   putExtra("param 1", "Simple")
}
Run Code Online (Sandbox Code Playgroud)

  • 此外,除了“block(intent)”之外,您还可以调用“intent.block()”或“Intent(this, T::class.java).apply(block)” (2认同)

tyn*_*ynn 8

与其使用成对的列表,不如考虑使用Bundle。然后,您可以使用添加它putExtras(Bundle)

如果您想前进一步,可以添加一个lambda扩展来配置其他功能:

fun <T> Context.openActivity(it: Class<T>, extras: Bundle.() -> Unit = {}) {
  var intent = Intent(this, it)
  intent.putExtras(Bundle().apply(extras))
  startActivity(intent)
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以将其称为:

openActivity(MyActivity::class.java) {
  putString("string.key", "string.value")
  putInt("string.key", 43)
  ...
}
Run Code Online (Sandbox Code Playgroud)