0

我正在开发的应用程序有三个类。MainActivity(这里不重要)MyFragmentMyClass. 我lateinit里面有一个 List 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 property myViewsList not initialized”错误(当片段被销毁、启动或类似的东西时它不会被调用。在我的应用程序中,调用它需要大约 10 秒 -为简单起见,我只是将其放入 aOnClickListener中——在这 10 秒内没有任何活动变化)。

我不明白为什么,因为它是在 OnCreateView中初始化myViewsList = listOf<View>(viewA,viewB,viewC)的。任何涉及myViewsListinside的调用MyFragment都很好,但不是 inside MyClass。那么,为什么会这样呢?调用或初始化它的正确方法是什么?

4

1 回答 1

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()
    }


}
于 2020-05-30T17:38:21.763 回答