【问题标题】: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 的上下文,所以请谨慎使用。

    【讨论】:

      【解决方案2】:

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

      我看到你在使用viewmodel,说明你在使用MVVM,你应该使用Sharing data between Activities and Fragments in MVVM made simple with SharedViewModel的概念来和activity的viewmodel进行通信。

      要与托管您的Fragment 的Activity 通信,您应该使用interface pattern of communication. from fragment to the activity

      假设您的activity 之一不会扩展基本活动,因为它必须从库中扩展一个活动,比如说YouTubeBaseActivity,它会承载一个特定片段,现在BaseActivity 的演员将永远不会在您的活动中取得成功。

      【讨论】:

        猜你喜欢
        • 2020-12-01
        • 1970-01-01
        • 2014-08-30
        • 1970-01-01
        • 1970-01-01
        • 2021-12-16
        • 2017-04-06
        • 1970-01-01
        • 2021-12-05
        相关资源
        最近更新 更多