如何在另一个activity中获取fragment?

问题描述 投票:0回答:1

我的项目由以下结构组成。

(活动-->可以附加的片段)

MainActivity --> Fragment A / Fragment B

OtherActivity --> Fragment C / Fragment D

Fragment A 和 B 都可以运行 OtherActivity,我想接收 OtherActivity 运行时附加的 Fragment。

最Naive的做法是在Framgent A和B上运行OtherActivity时向putExtra()发送数据,并根据数据确定要执行的Fragment。

像这样:

// FragmentA.kt
override fun onCreate() {
    binding.btn.setOnClickListener {
        val intent = Intent(requireActivity(), OtherActivity::class.java)
        intent.putExtra("frag", "FragmentC")
        requireActivity().startActivity(intent)
    }
}

// OtherActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    
    val fragment = intent.getStringExtra("frag")
    when(fragment) {
        "FragmentC" -> {
            setChangeFragment(FragmentC())
        }
        "FragmentD" -> { ... }
    }
}

private fun setChangeFragment(fragment: Fragment) {
    val fragmentManager = supportFragmentManager
    val fragmentTransaction = fragmentManager.beginTransaction()
    fragmentTransaction.replace(R.id.frame_layout, fragment)
    fragmentTransaction.commit()
}

但是,这种方式会随着OtherActivity中要执行的fragment数量的增加而呈指数级增加代码的长度。

因此,我尝试使用 findFragmentById 来运行它。

// FragmentA.kt
override fun onCreate() {
    mViewDataBinding.btn.setOnClickListener {
        val intent = Intent(requireActivity(), OtherActivity::class.java)
        intent.putExtra("layoutId", R.layout.fragment_c)
        requireActivity.startActivity(intent)
    }
}

// OtherActivity.kt
private fun initFragment() {
    val fragmentLayoutId: Int = intent.getIntExtra("layoutId", 0)
    if (fragmentLayoutId == 0)
        finish()
    else {
        val fragment = supportFragmentManager.findFragmentById(fragmentLayoutId)!!
        setChangeFragment(fragment)
    }
}

private fun setChangeFragment(fragment: Fragment) {
    val fragmentManager = supportFragmentManager
    val fragmentTransaction = fragmentManager.beginTransaction()
    fragmentTransaction.replace(R.id.frame_layout, fragment)
    fragmentTransaction.commit()
}

但是没有成功。这是因为findFragmentById这种方式传递的不是R.layout.somelayout,而是activity的xml文件中fragment标签或者framelayout标签的id。

在这种情况下最好的方法是什么?

android kotlin android-fragments
1个回答
0
投票

这两种方法都行不通。 无法在 Activity 之外共享 Fragments 实例。此外,您不应该在应用程序开发中这样做。 Android 生态系统不是这样设计的。 如果您希望将相同的导航应用于多个屏幕,我可以使用以下方法来实现此目的:

  1. 使用容器Fragment,里面有多个Fragment。该片段将具有与片段之间正确导航相关的逻辑。
  2. 对两个活动使用相同的导航图。 - https://developer.android.com/guide/navigation/get-started
© www.soinside.com 2019 - 2024. All rights reserved.