"Lateinit property has not been initialized" 在 onCreateView 中初始化的变量错误
"Lateinit property has not been initialized" error on a variable initialized in onCreateView
我正在开发的应用程序有三个 类。 MainActivity
(这里不重要),MyFragment
和MyClass
。
我在 MyFragment
中有一个 lateinit
列表 - 它是 lateinit
因为它将被某些方法使用。 (顺便说一句,我正在使用 kotlin 合成器)
class MyFragment: Fragment()
lateinit var myViewsList: List<View>
lateinit var viewA: View
lateinit var viewB: View
lateinit var viewC: View
override fun onCreateView(
//inflating the layout...
): View? {
val view = inflater.inflate(R.layout.fragment_timer, container, false)
val button: Button = view.myButton
viewA = view.myViewA
viewB = view.myViewB
viewC = view.myViewC
myViewsList =
listOf<View>(viewA,viewB,viewC)
myButton.setOnClickListener() {
MyClass().myMethod()
}
return view
}
然后MyClass
:
class MyClass() {
fun showViews {
MyFragment().myViewsList.forEach { // this line is causing the error
it.visibility = View.VISIBLE
}
}
fun myMethod() {
//do some stuff
//delay...
showViews()
}
}
但是每当调用 showViews()
时我都会收到 "lateinit property myViewsList not initialized" 错误(当片段被销毁、启动或类似的时候它不会被调用。在我的应用程序中,它需要您需要大约 10 秒的时间来调用它 - 为了简单起见,我只是将它放在 OnClickListener
中 - 在这 10 秒内没有任何 activity 变化)。
我不明白为什么,因为它 是在 OnCreateView myViewsList = listOf<View>(viewA,viewB,viewC)
中初始化的 。在 MyFragment
内涉及 myViewsList
的任何调用都可以正常工作,但在 MyClass
内则不行。那么,为什么会这样呢?调用或初始化它的正确方法是什么?
我在这里可能是错的,但我认为 Android 片段 class 不会像任何其他常规 class 一样工作。当您调用 MyFragment().myViewsList 时,您调用的不是片段的同一个实例,当您调用这个尚未初始化的变量 "myViewsList" 时,它会崩溃。
要使其正常工作,您必须传递您的列表和希望使其可见的视图。
class MyFragment: Fragment()
lateinit var myViewsList: List<View>
lateinit var viewA: View
lateinit var viewB: View
lateinit var viewC: View
override fun onCreateView(
//inflating the layout...
): View? {
val view = inflater.inflate(R.layout.fragment_timer, container, false)
val button: Button = view.myButton
viewA = view.myViewA
viewB = view.myViewB
viewC = view.myViewC
myViewsList =
listOf<View>(viewA,viewB,viewC)
myButton.setOnClickListener() {
MyClass(myViewsList).myMethod()
}
return view
}
你的class应该是这样的:
class MyClass(private val views: List<View>) {
fun showViews {
views.forEach { // this line is causing the error
it.visibility = View.VISIBLE
}
}
fun myMethod() {
//do some stuff
//delay...
showViews()
}
}
我正在开发的应用程序有三个 类。 MainActivity
(这里不重要),MyFragment
和MyClass
。
我在 MyFragment
中有一个 lateinit
列表 - 它是 lateinit
因为它将被某些方法使用。 (顺便说一句,我正在使用 kotlin 合成器)
class MyFragment: Fragment()
lateinit var myViewsList: List<View>
lateinit var viewA: View
lateinit var viewB: View
lateinit var viewC: View
override fun onCreateView(
//inflating the layout...
): View? {
val view = inflater.inflate(R.layout.fragment_timer, container, false)
val button: Button = view.myButton
viewA = view.myViewA
viewB = view.myViewB
viewC = view.myViewC
myViewsList =
listOf<View>(viewA,viewB,viewC)
myButton.setOnClickListener() {
MyClass().myMethod()
}
return view
}
然后MyClass
:
class MyClass() {
fun showViews {
MyFragment().myViewsList.forEach { // this line is causing the error
it.visibility = View.VISIBLE
}
}
fun myMethod() {
//do some stuff
//delay...
showViews()
}
}
但是每当调用 showViews()
时我都会收到 "lateinit property myViewsList not initialized" 错误(当片段被销毁、启动或类似的时候它不会被调用。在我的应用程序中,它需要您需要大约 10 秒的时间来调用它 - 为了简单起见,我只是将它放在 OnClickListener
中 - 在这 10 秒内没有任何 activity 变化)。
我不明白为什么,因为它 是在 OnCreateView myViewsList = listOf<View>(viewA,viewB,viewC)
中初始化的 。在 MyFragment
内涉及 myViewsList
的任何调用都可以正常工作,但在 MyClass
内则不行。那么,为什么会这样呢?调用或初始化它的正确方法是什么?
我在这里可能是错的,但我认为 Android 片段 class 不会像任何其他常规 class 一样工作。当您调用 MyFragment().myViewsList 时,您调用的不是片段的同一个实例,当您调用这个尚未初始化的变量 "myViewsList" 时,它会崩溃。
要使其正常工作,您必须传递您的列表和希望使其可见的视图。
class MyFragment: Fragment()
lateinit var myViewsList: List<View>
lateinit var viewA: View
lateinit var viewB: View
lateinit var viewC: View
override fun onCreateView(
//inflating the layout...
): View? {
val view = inflater.inflate(R.layout.fragment_timer, container, false)
val button: Button = view.myButton
viewA = view.myViewA
viewB = view.myViewB
viewC = view.myViewC
myViewsList =
listOf<View>(viewA,viewB,viewC)
myButton.setOnClickListener() {
MyClass(myViewsList).myMethod()
}
return view
}
你的class应该是这样的:
class MyClass(private val views: List<View>) {
fun showViews {
views.forEach { // this line is causing the error
it.visibility = View.VISIBLE
}
}
fun myMethod() {
//do some stuff
//delay...
showViews()
}
}