我已阅读文章https://github.com/Kotlin/anko/wiki/Anko-Commons-%E2%80%93-Intents。
我可以使用startActivity(intentFor<SomeOtherActivity>("id" to 5).singleTop())
打开一个新的活动。
代码A由Android Studio 3.0.1自动转换为Java。我可以使用openActivity(applicationContext, UIBuy::class.java)
调用它。
如何使用org.jetbrains.anko.startActivity
优化功能?谢谢!
代码A
fun openActivity(mContext: Context, myClass: Class<*>) {
val intent = Intent().setClass(mContext, myClass)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
mContext.startActivity(intent)
}
代码B
fun openActivity(mContext: Context, myClass: Class<*>) {
startActivity<myClass>().FLAG_ACTIVITY_NEW_TASK
}
答案 0 :(得分:3)
为了优化,您可以使用以下代码:
startActivity(intentFor<YourActivity>().newTask())
其中,intent是Anko的功能。
Anko的startActivity()问题在于它不允许你设置标志。你只能将params传递给Bundle。这是此功能的实现:
inline fun <reified T: Activity> Context.startActivity(vararg params: Pair<String, Any?>) =
AnkoInternals.internalStartActivity(this, T::class.java, params)
而且internalStartActivity使用内部createIntent方法填充&#34; params&#34;。所以你可以看到你必须自己提供意图。
编辑:
要创建openActivity方法,您可以使用内联方法来使用类泛型。
正如评论中提到的那样,传递上下文有不同的方式:
(上下文的扩展功能)
inline fun <reified T : Activity>Context.openActivity() {
startActivity(intentFor<T>().newTask())
}
或 (将上下文作为参数传递)
inline fun <reified T : Activity>openActivity(context: Context) {
context.startActivity(intentFor<T>().newTask())
}
或 (如果你有,请在父活动内使用)
inline fun <reified T : Activity>openActivity() {
startActivity(intentFor<T>().newTask())
}
Here您将找到有关内联函数和已知类型参数的更多信息。但正如您所看到的 - 建议的解决方案与原始的Anko方法非常相似。
答案 1 :(得分:0)
首先, Code B (startActivity<myClass>()
)无法编译,因为您无法将Class
对象写为泛型类型的名称。
如果要为Intent设置标记,则不能使用org.jetbrains.anko.startActivity
。为什么?如果您检查Intents.kt
的文件anko-commons-0.10.4-sources.jar
,您会看到函数扩展名startActivity
仅接受Pair
s,这是您要放置的名称和值你的意图中的额外内容。
但是,如果您使用扩展函数org.jetbrains.anko.newTask
,即addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
的糖语法,则可以简化代码:
fun openActivity(mContext: Context, myClass: Class<*>) =
mContext.startActivity(Intent().setClass(mContext, myClass).newTask())
然后,您可以openActivity(applicationContext, UIBuy::class.java)
。
答案 2 :(得分:0)
我这样做:
k