为什么我不能在Kotlin中使用startActivityForResult?

时间:2018-04-02 03:20:29

标签: android kotlin

我希望在Kotlin开设一项活动结果。

我看过艺术Can't Call StartActivityForResult in Anko

所以我将AppCompatActivity转换为Activity

但是代码(mContext as Activity).startActivityForResult<UIAddEditBackup>(requestCode = 1, "id" to 2L)还没有运行,为什么?

我的代码

class UIMain : AppCompatActivity() {

    private lateinit var mContext: Context

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.layout_main)
         mContext = this
         btnExit.setOnClickListener {
            startActivity<UIAddEditBackup>("id" to 2L)  //OK
            (mContext as Activity).startActivityForResult<UIAddEditBackup>(requestCode = 1, "id" to 2L) //Error          
        }
    }
}

1 个答案:

答案 0 :(得分:4)

根据Kotlin Offical Doc on named arguments

  

当使用位置参数和命名参数调用函数时,所有位置参数应放在第一个命名参数之前。例如,允许调用f(1, y = 2),但f(x = 1, 2)不是。

您正在使用startActivityForResult<UIAddEditBackup>(requestCode = 1, "id" to 2L)。情况就是这样。

所以,修理如下:

startActivityForResult<UIAddEditBackup>(1, "id" to 2L)

startActivityForResult<UIAddEditBackup>(requestCode = 1, params = *arrayOf("id" to 2L))

(Anko startActivityForResult的原型是inline fun <reified T: Activity> Activity.startActivityForResult(requestCode: Int, vararg params: Pair<String, Any?>))。

参考(the same page above

  

可以使用扩展运算符在命名表单中传递可变数量的参数(vararg):

     

fun foo(vararg strings: String) { /* ... */ }

     

foo(strings = *arrayOf("a", "b", "c"))

在这种情况下,

(mContext as Activity).不是必需的。