【问题标题】:Is it okay to access activity's properties and functions from fragment?可以从片段访问活动的属性和功能吗?
【发布时间】:2021-02-03 14:47:27
【问题描述】:
我是 android 新手,我想知道是否可以访问在活动中初始化的属性/从片段中调用活动函数,或者这是不好的做法,我应该避免它。
(requireContext() as BaseActivity).viewModel
(requireContext() as BaseActivity).countryList
(requireContext() as BaseActivity).getSomething()
【问题讨论】:
标签:
android
android-fragments
android-activity
android-viewmodel
clean-architecture
【解决方案1】:
你的直觉可能是对的。重大更改可能由名称冲突、变量隐藏、错误导入、错误赋值引起。但是如今,对功能的需求正在增加,因此您需要公共访问器。只要在你的良心上遵守这条规则:
- 接口在课堂之间的交流中非常强大
- 继承重要的内容,覆盖已实现的内容,传递给参数以减少全局变量损坏
- 如果变量可以以另一种全局形式存储,请考虑它的大小(ram 很重要)、访问速度(ux 很重要)、安全性(keys 很重要)和易变性(nulls 很重要)。
现在查看您的代码,我可以看到您有一个基于存储在主活动中的值/函数的片段系统,它为片段提供上下文。如果您应用第一点:您的片段将实现一个 BaseFragment 已经进行了一些上下文转换,即lateinit var mainActivity: MainActivity,那么您可以在片段中的任何位置使用mainActivity.viewModel 而无需转换。这更干净
应用第二点:在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.function”函数.如果某个超级函数覆盖它,则打开一个 var,如果您真的不知道何时需要它以及何时更改它,则只需放置 var。
关于第三点,Android 在早期阶段,我们经历了一个艰难的过程,即即使您的应用正在运行,上下文也不会永远持续下去。轮换和生命周期函数将粗略和快速地交换它。所以考虑其他存储方式。我仍然不相信 requireContext/Activity/view 的上下文,所以请谨慎使用。