Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用org.jetbrains.anko.startActivity优化startActivity功能?_Android_Kotlin_Anko - Fatal编程技术网

Android 如何使用org.jetbrains.anko.startActivity优化startActivity功能?

Android 如何使用org.jetbrains.anko.startActivity优化startActivity功能?,android,kotlin,anko,Android,Kotlin,Anko,我读过这篇文章 我可以使用startActivity(intentFor(“id”to 5).singleTop())打开一个新活动 代码A由Android Studio 3.0.1自动从Java转换而来。我可以用openActivity(applicationContext,UIBuy::class.java)调用它 如何使用org.jetbrains.anko.startActivity优化功能?谢谢 顺便说一句,代码B是错误的 代码A fun openActivity(mContext:

我读过这篇文章

我可以使用
startActivity(intentFor(“id”to 5).singleTop())
打开一个新活动

代码A由Android Studio 3.0.1自动从Java转换而来。我可以用openActivity(applicationContext,UIBuy::class.java)调用它

如何使用
org.jetbrains.anko.startActivity
优化功能?谢谢

顺便说一句,代码B是错误的

代码A

fun openActivity(mContext: Context, myClass: Class<*>) {
    val intent = Intent().setClass(mContext, myClass)
    intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK

    mContext.startActivity(intent)
}
有趣的openActivity(mContext:Context,myClass:Class){ val intent=intent().setClass(mContext,myClass) intent.flags=intent.FLAG\u活动\u新任务 mContext.startActivity(意图) } 代码B

fun openActivity(mContext: Context, myClass: Class<*>) {   
    startActivity<myClass>().FLAG_ACTIVITY_NEW_TASK
}
有趣的openActivity(mContext:Context,myClass:Class){ startActivity().标记活动新任务 }
要实现优化,您可以使用以下代码:

startActivity(intentFor<YourActivity>().newTask())
startActivity(intentFor().newTask())
其中intentFor是来自Anko的功能

Anko的startActivity()的问题在于它不允许您设置标志。您只能传递要放置在捆绑包中的参数。这是此功能的实现:

inline fun <reified T: Activity> Context.startActivity(vararg params: Pair<String, Any?>) =
        AnkoInternals.internalStartActivity(this, T::class.java, params)
inline fun Context.startActivity(vararg参数:Pair)=
internalStartActivity(this,T::class.java,params)
internalStartActivity使用内部createIntent方法填充“参数”。所以正如你所看到的,你必须自己提供意图

编辑:

要创建openActivity方法,可以使用内联方法来使用类泛型

正如评论中所提到的,传递上下文有不同的方式:

(语境的扩展功能)

inline fun Context.openActivity(){
startActivity(intentFor().newTask())
}
或 (将上下文作为参数传递)

inline-fun-openActivity(上下文:上下文){
context.startActivity(intentFor().newTask())
}
或 (如果有,请在父活动内部使用)

inline fun openActivity(){
startActivity(intentFor().newTask())
}
您将找到有关内联函数和具体化类型参数的更多信息。但正如您所看到的,建议的解决方案与最初的Anko方法非常相似。

首先,代码B(startActivity())无法编译,因为您无法将对象作为泛型的类型名称编写

如果您想为您的意图设置标志,则不能使用
org.jetbrains.anko.startActivity
。为什么?如果您检查
anko-commons-0.10.4-sources.jar
的文件
Intents.kt
,您将看到函数扩展名
startActivity
只接受
Pair
s,它们是您希望作为额外内容放入意图中的名称和值

但是,如果使用扩展函数
org.jetbrains.anko.newTask
,可以简化代码,这是
addFlags(Intent.FLAG\u ACTIVITY\u NEW\u TASK)

有趣的openActivity(mContext:Context,myClass:Class)= mContext.startActivity(Intent().setClass(mContext,myClass.newTask()) 然后,您可以执行
openActivity(applicationContext,UIBuy::class.java)

我这样做:

application.intentFor<AuthActivity>()
                .clearTop()
                .newTask()
                .also(application::startActivity)
application.intentFor()
.clearTop()
.newTask()
.另外(应用程序::startActivity)

您不能在函数
openActivity
内部使用扩展函数
intent,因为您不知道类型(除非您使用泛型修改
openActivity
)。我认为@hellocw希望将代码提取到函数中,以避免每次调用
newTask()
。请参阅我编辑的答案。我还意识到@hellocw希望将其提取为函数。您可以使用reifield轻松完成此操作。这是KotlinOK非常好的特性。但是您需要一个
上下文
才能调用
startActivity
。您可以使用
Context.openActivity
@JavierSA将函数转换为扩展函数。我编辑了我的答案,以显示传递上下文的不同方法。我认为这有点多余,但也许有人会利用它。
inline fun <reified T : Activity>openActivity(context: Context) {
    context.startActivity(intentFor<T>().newTask())
}
inline fun <reified T : Activity>openActivity() {
    startActivity(intentFor<T>().newTask())
}
fun openActivity(mContext: Context, myClass: Class<*>) =
    mContext.startActivity(Intent().setClass(mContext, myClass).newTask())
application.intentFor<AuthActivity>()
                .clearTop()
                .newTask()
                .also(application::startActivity)