Kotlin开发中如何根据启动Fragment的源Activity选择viewModel调用方法
实现方案
方案1:跳转时携带参数标记来源(官方推荐,低耦合)
这是最稳妥的实现方式,和宿主Activity完全解耦,后续新增其他跳转来源时拓展成本极低:
- 第一步:在Fragment中定义参数常量和实例创建方法
class NewsListFragment : Fragment() { companion object { // 来源标记常量 const val SOURCE_A = "activity_a" const val SOURCE_B = "activity_b" private const val ARG_SOURCE = "arg_source" // 供外部调用创建Fragment实例,统一传入来源参数 fun newInstance(source: String): NewsListFragment { val fragment = NewsListFragment() fragment.arguments = Bundle().apply { putString(ARG_SOURCE, source) } return fragment } } private var currentSource: String? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 初始化时读取来源参数 currentSource = arguments?.getString(ARG_SOURCE) } }
- 第二步:对应Activity中创建Fragment实例时传入对应标记
- ActivityA中创建时调用:
NewsListFragment.newInstance(NewsListFragment.SOURCE_A) - ActivityB中创建时调用:
NewsListFragment.newInstance(NewsListFragment.SOURCE_B)
- ActivityA中创建时调用:
- 第三步:业务逻辑中按来源执行不同请求
if(shouldPaginate){ when(currentSource) { NewsListFragment.SOURCE_A -> viewModel.getUsBreakingNews("tr") NewsListFragment.SOURCE_B -> viewModel.getUsBreakingNews("us") } isScrooling = false }
方案2:直接判断宿主Activity类型(快速实现,耦合度高)
如果不需要考虑后续拓展,只想快速实现,可以直接判断Fragment当前附着的Activity类型,不需要修改跳转逻辑:
if(shouldPaginate){ when(requireActivity()) { is ActivityA -> viewModel.getUsBreakingNews("tr") is ActivityB -> viewModel.getUsBreakingNews("us") } isScrooling = false }
注意:该方法仅适用于该Fragment只会附着在ActivityA、ActivityB两个页面的场景,否则会出现逻辑判断遗漏的问题。
内容的提问来源于stack exchange,提问作者Bagwell
相关产品推荐
相关产品推荐

