我的项目由以下结构组成。
(活动-->可连接的片段)
MainActivity --> Fragment A / Fragment B
OtherActivity --> Fragment C / Fragment D
Fragment A和B都可以运行CNORT-Activity,我希望接收将在CNORT-Activity运行时附加的Fragment。
最简单的方法是在Fragent A和B上运行codeActivity时将数据发送到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()
}
但是,这种方式会随着在CNORTActivity中执行的片段数量的增加而呈指数级增加代码的长度。
所以,我尝试使用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。
在这种情况下,什么是最好的方法?
1条答案
按热度按时间1l5u6lss1#
两种方法都行不通。不可能在Activity之外共享Fragment的示例。此外,你不应该在你的应用程序开发中这样做。这不是Android生态系统的设计方式。如果你想将同一个导航应用到多个屏幕,我看到了以下方法:
1.使用包含多个片段的容器片段。该片段将具有与片段之间的正确导航相关的逻辑。
1.对两个活动使用相同的导航图。- https://developer.android.com/guide/navigation/get-started