从伴生对象内的参考视图-Kotlin

从伴生对象内的参考视图-Kotlin,kotlin,Kotlin,我的目标是从类(和包)外部静态更新视图的状态。目前,我有一个类的伴生对象和一个公共函数来实现这一点 但是,当我试图从伴随对象中引用“父对象”的视图时,编译器会抱怨“未解析引用”。有人知道正确的方法吗?提前谢谢 class MyActivity: AppCompatActivity() { companion object { fun updateDisplay(message: String) { mTextView.text = message

我的目标是从类(和包)外部静态更新视图的状态。目前,我有一个类的伴生对象和一个公共函数来实现这一点

但是,当我试图从伴随对象中引用“父对象”的视图时,编译器会抱怨“未解析引用”。有人知道正确的方法吗?提前谢谢

class MyActivity: AppCompatActivity() {

    companion object {
        fun updateDisplay(message: String) {
            mTextView.text = message // Unresolved reference: mTextView
        }
    }

    @BindView(R.id.my_text_view) lateinit var mTextView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.my_activity)
        ButterKnife.bind(this)
    }

    // ...

}

我不建议使用此选项,但我会将其保留在此处,因为我在评论中了解到了一些东西!):

类MyActivity:AppCompatActivity(){
伴星{
//在此处引用类实例
变量实例:MyActivity?=null
趣味updateDisplay(消息:字符串){
实例?.findViewById(R.id.mTextView)?.let{
it.text=消息
}
}
}
@BindView(R.id.my_text_view)lateinit var mTextView:TextView
重写创建时的乐趣(savedInstanceState:Bundle?){
instance=这//意味着它将始终引用最近创建的实例
super.onCreate(savedInstanceState)
setContentView(R.layout.my_活动)
黄油刀,绑(这个)
}
// ...
}

没有什么好办法可以做到这一点。伴生对象不知道该类存在哪些实例,也不能以任何方式与这些实例交互。您需要有一个对您试图以某种方式更改的活动的引用。(活动可能甚至没有显示)这样你就泄露了你的活动。这很糟糕吗?(我也在学习自己,所以非常愿意发表评论)关于活动泄密,请看:事实上,你也在使用一个全球性的,这是一个非常有说服力的实践。感谢Joozd,我成功地在课堂上引用了这个观点。然而,正如@al3c所指出的,使用全局变量和活动泄漏不值得这么麻烦。我得用更好的方式设计这个项目。谢谢大家!
class MyActivity: AppCompatActivity() {

    companion object {
        // make a reference to the class instance in here
        var instance: MyActivity? = null

        fun updateDisplay(message: String) {
            instance?.findViewById<TextView>(R.id.mTextView)?.let{
                it.text = message 
            }
        }
    }

    @BindView(R.id.my_text_view) lateinit var mTextView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {

        instance = this // meaning it will always reference the most recent instance created

        super.onCreate(savedInstanceState)
        setContentView(R.layout.my_activity)
        ButterKnife.bind(this)
    }

    // ...

}