【发布时间】:2020-09-18 05:03:15
【问题描述】:
我正在开发的应用程序包含三个类。 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 秒内没有任何活动变化)。
我不明白为什么,因为它在 OnCreateView myViewsList = listOf<View>(viewA,viewB,viewC) 中被初始化。任何涉及myViewsList 内部MyFragment 的调用都可以正常工作,但不能在MyClass 内部调用。那么,为什么会这样呢?调用或初始化它的正确方法是什么?
【问题讨论】:
-
查看这篇文章,它会解决你的问题:stackoverflow.com/a/46584412/9636037
-
MyFragment().myViewsList您正在创建新的片段实例,而不是传递对现有片段的引用。 -
@Abhimanyu 嗯...它不会总是跳过我的代码中带有
if (...isInitialized)的部分 - 因为它说“...尚未初始化”?反正我会试试的。谢谢 -
我的意思是说它会像一个空检查,但它不会解决你的问题,这并不意味着你不应该使用空检查,它们非常重要。现在,因为您在
NavigationDrawer中使用MyFragment,所以您可以传递它的引用,因此当您调用MyClass中的列表时,您将调用已经初始化的实际列表。您在这里所做的是实际上并没有传递引用,而是创建了该片段的新引用,这显然是未初始化列表的原因。 -
我找到了一个类似的answer,但它不适用于 NavigationDrawer,但它可以提供帮助。您可以在您的案例中使用类似的参考。