我正在开发的应用程序具有三个类。 MainActivity
(此处不重要),MyFragment
和MyClass
。
我在lateinit
内有一个MyFragment
列表-它是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属性myViewsList未初始化”错误(当片段被破坏,启动或类似操作时,它不会被调用。在我的应用中,您需要10秒钟的时间才能调用它-为简单起见,我将其放在OnClickListener
中-在这10秒钟内没有任何活动变化)。
我不明白为什么,因为它在OnCreateView myViewsList = listOf<View>(viewA,viewB,viewC)
中被初始化了。在myViewsList
内部涉及MyFragment
的任何呼叫都可以,但在MyClass
内部则不能。那么,为什么会这样呢?调用或初始化它的正确方法是什么?
答案 0 :(得分:1)
我在这里可能是错的,但是我认为Android片段类不会像任何其他常规类一样工作。当您调用 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 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()
}
}