是否可以从片段访问活动的属性和函数?



我是新的android,我想知道它是否可以访问属性初始化的活动/调用活动函数从片段像这样,或者它是坏的做法,我应该避免它。

(requireContext() as BaseActivity).viewModel
(requireContext() as BaseActivity).countryList
(requireContext() as BaseActivity).getSomething()

你的直觉可能是对的。破坏性更改可能由名称冲突、变量阴影、错误导入、错误赋值引起。但是现在,对功能的需求正在增加,因此您需要公共访问器。把这些规则记在心里:

  • 接口在类到类的通信中是强大的
  • 继承重要的内容,覆盖已经实现的内容,传递给参数以减少全局变量损害
  • 如果一个变量可以以另一种全局形式存储,考虑它的大小(ram问题),访问速度(ux问题),安全性(关键问题)和波动性(null问题)。

现在看看你的代码,我可以看到你有一个基于存储在主活动中的值/函数的片段系统,它为片段提供了上下文。如果你应用第一点:你的片段将实现一个BaseFragment,已经有一些上下文cast即lateinit var mainActivity: MainActivity,那么你可以mainActivity.viewModel在你的片段的任何地方没有cast。这是cleaner

应用第二个点:在BaseFragment(将被AnotherFragment继承)

abstract var viewModel: ViewModel
abstract fun initList()
open var countryList = mutableListOf()
open fun onScale(detector: ScaleGestureDetector) { //pinch: increase visible country list like some nice zoom effect .. etc  }

如果你的大部分或所有的片段需要类似的函数或变量,抽象到一些你可能会忘记的东西会崩溃的应用程序,打开那些"功能,但我不需要重写,所以我将调用super。函数的功能。如果某个超函数覆盖了var,就把它打开,如果你真的不知道什么时候需要它,什么时候需要修改它,就把var放进去。

关于第三点,Android在早期阶段,我们认识到即使你的应用正在运行,上下文也不会永远持续下去。旋转和生命周期函数会粗略而快速地交换它。所以考虑其他的存储方式。我仍然不相信requireContext/Activity/view for context,所以请谨慎使用。

一个大大的NO。从片段中使用硬编码引用activity是一种不好的做法。

我看到你正在使用viewmodel,这表明你正在使用MVVM,你应该使用在MVVM中使用SharedViewModel在活动和片段之间共享数据与活动的视图模型通信的概念。

为了与承载FragmentActivity通信,您应该使用接口通信模式。从片段到活动

让我们说你的一个activity不会扩展基础活动,因为它必须从一个库扩展一个活动,让我们说YouTubeBaseActivity,它将托管一个特定的片段现在cast到BaseActivity将永远不会在你的活动中成功。

最新更新