【问题标题】:Unable to access variable from innerclass : Kotlin android无法从内部类访问变量:Kotlin android
【发布时间】:2018-03-04 16:55:59
【问题描述】:

我是 Android 中 Kotlin 开发的新手。在这里,我试图从它的内部类访问一个类中定义的变量,如下所示。

class MainActivity : AppCompatActivity() {

    var frags: MutableList<Fragment> = mutableListOf()

//.............onCreate and other methods ....

    internal class CustAdapter(var arrayList: ArrayList<NavigationData>) : RecyclerView.Adapter<CustAdapter.MyViewHolder>() {
    override fun onBindViewHolder(holder: MyViewHolder?, position: Int) {
        holder!!.bindItems(arrayList[position])
    }

    override fun getItemCount(): Int {
        return arrayList.size
    }
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustAdapter.MyViewHolder {
        val v = LayoutInflater.from(parent.context).inflate(R.layout.navigation_item, parent, false)
        return MyViewHolder(v)
    }

    class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        fun bindItems(data: NavigationData) {


            itemView.setOnClickListener {
                   frags.add(BoardFrag()) ///// here i'm getting error "unresolved symbol"

            }
        }
    }
}    
}

内部类 MyViewHolder 不允许我访问外部范围的任何变量。

即使我无法访问从内部类方法中的 import kotlinx.android.synthetic.main.activity_main.* 导入的视图 ID。

我能够在java 中以这种方式访问​​变量,但我已经阅读了有关 stackoverflow 的许多问题,但我还没有得到答案。

【问题讨论】:

  • 使用内部,而不是内部 =)
  • 使用inner关键字代替内部class parent { val m=1; inner class child{ print(m)} }

标签: android class kotlin


【解决方案1】:

您应该在适配器中使用内部修饰符。

这个修饰符使得内部类可以访问外部类的成员

参考:https://kotlinlang.org/docs/reference/nested-classes.html

【讨论】:

  • 感谢您的解决方案。这个小错误从两天开始就一直困扰着我,而您又挽救了我的一天
  • 不客气!内部和内部的名称真的很棘手......我想保持受保护会更好
  • 我不知道受保护和内部和内部之间的区别,但我会尝试自己解决
【解决方案2】:

将您的嵌套类定义为inner,然后您将能够访问外部类成员变量。

class OuterClass{

var accessMe ="access me from Inner Class"

    inner class InnerClass{

       //....


        fun accessingOuterClassVariable(){

           accessMe = "Now the variable is accessed"

        }

    }

}

【讨论】:

  • var accessMe 的呼叫站点在哪里?
  • @IgorGanapolsky 请检查,我已经更新了答案。
【解决方案3】:

为了快速简单地回答这个问题,我会做以下事情:

class OuterClass{

private var accessibleInside: CustomObject? = null
inner class InnerClass{

    //....
}

现在CustomObject 可以是从ContextString 的任何东西,希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2020-02-29
    • 2022-11-10
    • 1970-01-01
    • 2011-06-15
    • 2015-05-25
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    相关资源
    最近更新 更多