繁体   English   中英

Android 从 Fragment 中删除 Activity 观察者

[英]Android remove Activity observer from Fragment

我有 MVVM 单个活动应用程序,任务每 x 分钟运行一次。

Activity我正在观察该任务的结果。 一切正常。

导航到某个Fragment我想停止在Activity观察它,导航到另一个Fragment后再次观察它(在 Activity 中)。

在Activity中观察的代码

    settingsViewModel.pb.observe(this, Observer {
        pb.visible(it)
    })

希望我把问题说清楚了

你需要做的就是

  override fun onDestroyView() {
    super.onDestroyView()
    viewModel.request.removeObservers(this)
}

你为什么不改变观察者,而是观察 Activity,如果该片段可见,只需从 Activity 更新它。 就像是:

settingsViewModel.pb.observe(this, Observer {
        if (currentFrag is yourFragment) {
            // currentFrag.doSomething()
        } else {
            pb.visible(it)
        }
    })

编辑1:

查看导航片段的 primaryNavigationFragment 属性,您可以在那里获得对它的引用:

val navHost = supportFragmentManager.findFragmentById(R.id.main_nav_fragment)
    navHost?.let { navFragment ->
        navFragment.childFragmentManager.primaryNavigationFragment?.let {currentFrag->
                // currentFrag.doSomething()
        }
    }
}

您可以删除活动生命周期的所有观察者

settingsViewModel.pb.removeObservers(mActivity)

它将删除该实时数据的所有观察者。当再次移动到另一个片段时,您可以像正在做的那样设置新的观察者

settingsViewModel.pb.observe(this, Observer {
        pb.visible(it)
    })

首先使用SharedViewModel在您的所有片段中拥有您的视图模型,并在您需要的每个片段中观察您的实时数据。 然后在观察到livedata时调用您的活动方法。

fragment1 {
    sharedViewModel.pb.observe(viewLifecycleOwner, Observer {
        activityCallBack.someMethod()
    })
}

fragment2 {
    sharedViewModel.pb.observe(viewLifecycleOwner, Observer {
        activityCallBack.someMethod()
    })
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM