【问题标题】:Android: getActivity() null when calling it from the ViewModel as a callbackAndroid:从 ViewModel 作为回调调用 getActivity() 时为 null
【发布时间】:2020-08-24 22:18:06
【问题描述】:

我的项目设置了 DataBinding,所以 RecyclerView Item 被点击,Fragment 的 ViewModel 获取数据并需要更改 Fragment。因此,我创建了一个在 Fragment 本身中实现的回调来更改它,但是当它被调用时,getActivity() 函数(或下面写的“活动?”)为空。

回调接口

interface FragmentCallBack {
    fun fragmentCallBack(object: Object?)
}

片段

class MainFragment : Fragment(), FragmentCallBack {
    override fun fragmentCallBack(object: Object?) {
        val fragment = NewFragment.newInstance()
        // Here is the issue <------------------------
        activity?.supportFragmentManager?.beginTransaction()?.replace(R.id.container, fragment)?.commit()
    }
}

片段视图模型

class FragmentViewModel : ViewModel() {
    val callback: FragmentCallBack = MainFragment()

    private fun getData(string: String) {
        val liveData = Repository.getData(string)
        callback.fragmentCallBack(liveData.value)
    }
}

【问题讨论】:

    标签: android android-fragments mvvm callback android-viewmodel


    【解决方案1】:

    您在 ViewModel 中手动构造 MainFragment,而没有将其正确添加到任何容器中。在这种情况下,它不与任何 Activity 关联,因此 NPE 是预期的结果。

    这段代码有几个问题:

    • 应将片段添加到容器中。最好的方法是使用一些 Fragment 管理库
    • ViewModel 不应该“知道”任何关于 Fragments 的信息
    • 从外部(例如 fragmentCallback)对 Fragments 调用方法总是会引发问题
    • [最佳实践] 如果您有一个名为getData 的方法,则调用导致导航的回调可能不是最佳设计。这不是名字所暗示的,命名很重要。

    坦率地说,这段代码表明您对 Fragment 和 ViewModel 的经验并不丰富,因此我建议您阅读文档。否则,使用这两个复杂的 API 可能会导致很多问题和挫败感。

    【讨论】:

    • 谢谢,我了解片段是什么以及应该如何隔离视图模型。我只是在学习如何设置数据绑定以跳过视图中的样板代码。我遇到的问题是,由于我不再在片段本身中编写代码,因为数据绑定结果直接进入 viewModel,所以我需要一种方法来在用户点击项目时从 viewModel 更改片段。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多