为什么Intent构造函数在伴随对象中是不可见的?科特林

时间:2017-06-20 05:33:22

标签: android android-intent android-recyclerview kotlin android-adapter

class MainActivity : AppCompatActivity() {

    companion object {
        fun makeIntent(pos : Int) {
            println("${pos} is here!")
            var intent = Intent(this, DetailActivity::class.java)
            if (intent != null) {
                println("intent is not null in makeIntent function")
            }   else {
                println("intent is null in makeIntent function")
            }
        }
    }

    ... 
}

在执行var intent = Intent(...)时,它看不到意图。为什么呢?

2 个答案:

答案 0 :(得分:2)

Intent构造函数需要Context作为参数传递。内部makeIntent this是对companion object实例的引用。伴随对象没有引用包含类的实例。因此,您必须以某种方式传递Context,例如:

class MainActivity : AppCompatActivity() {
    companion object {
        fun makeIntent(pos : Int, context:Context):Intent {
            println("${pos} is here!")
            var intent = Intent(context, DetailActivity::class.java)
            return intent
    }
}

答案 1 :(得分:0)

除了@ meinsol的优秀答案之外,如果向makeIntent函数添加接收器,您可以保持代码几乎相同:

class MainActivity : AppCompatActivity() {

    companion object {
        fun Context.makeIntent(pos : Int) {  // <- Notice the Context receiver here
            println("${pos} is here!")
            var intent = Intent(this, DetailActivity::class.java)
            // Do what you want with the intent
        }
    }

    ... 
}

然后您可以从上下文中的任何位置(makeIntent(5))调用它,或者如果您不在上下文中但有一个可用,请使用它(context.makeIntent(5)