非常简单的问题:是否有可能为第二对参数(String,Int,Bundle等)找到通用的Intent额外类型?
inline fun <reified T : Activity> Context.startActivity(vararg params: Pair<String, ?>) {
val intent = Intent(this, T::class.java)
params.forEach { intent.putExtra(it.first, it.second) }
startActivity(intent)
}
由于
答案 0 :(得分:2)
我认为使用当前的语言功能和Android API无法做到这一点。
如果你深入研究Anko的来源,你会发现它们最终也会采用微不足道的丑陋解决方案。 (对于您应该使用的更高级别的公共函数,它们使用vararg params: Pair<String, Any?>
,然后委托以下内容。)
@JvmStatic
private fun fillIntentArguments(intent: Intent, params: Array<out Pair<String, Any?>>) {
params.forEach {
val value = it.second
when (value) {
null -> intent.putExtra(it.first, null as Serializable?)
is Int -> intent.putExtra(it.first, value)
is Long -> intent.putExtra(it.first, value)
is CharSequence -> intent.putExtra(it.first, value)
is String -> intent.putExtra(it.first, value)
is Float -> intent.putExtra(it.first, value)
is Double -> intent.putExtra(it.first, value)
is Char -> intent.putExtra(it.first, value)
is Short -> intent.putExtra(it.first, value)
is Boolean -> intent.putExtra(it.first, value)
is Serializable -> intent.putExtra(it.first, value)
is Bundle -> intent.putExtra(it.first, value)
is Parcelable -> intent.putExtra(it.first, value)
is Array<*> -> when {
value.isArrayOf<CharSequence>() -> intent.putExtra(it.first, value)
value.isArrayOf<String>() -> intent.putExtra(it.first, value)
value.isArrayOf<Parcelable>() -> intent.putExtra(it.first, value)
else -> throw AnkoException("Intent extra ${it.first} has wrong type ${value.javaClass.name}")
}
is IntArray -> intent.putExtra(it.first, value)
is LongArray -> intent.putExtra(it.first, value)
is FloatArray -> intent.putExtra(it.first, value)
is DoubleArray -> intent.putExtra(it.first, value)
is CharArray -> intent.putExtra(it.first, value)
is ShortArray -> intent.putExtra(it.first, value)
is BooleanArray -> intent.putExtra(it.first, value)
else -> throw AnkoException("Intent extra ${it.first} has wrong type ${value.javaClass.name}")
}
return@forEach
}
}
答案 1 :(得分:0)
我认为不可能。看看implementation of the putExtra() methods。
他们没有使用多态来确定要执行的操作类型,您确实需要为其第二个参数调用具有正确类型签名的方法。