我的项目由以下结构组成。
(活动-->可以附加的片段)
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。
在这种情况下最好的方法是什么?
这两种方法都行不通。 无法在 Activity 之外共享 Fragments 实例。此外,您不应该在应用程序开发中这样做。 Android 生态系统不是这样设计的。 如果您希望将相同的导航应用于多个屏幕,我可以使用以下方法来实现此目的: