You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
  • 第三步:业务逻辑中按来源执行不同请求
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 15:15:04