Android Fragments 如何在另一个活动中获得片段?

db2dz4w8  于 2023-10-19  发布在  Android
关注(0)|答案(1)|浏览(126)

我的项目由以下结构组成。
(活动-->可连接的片段)

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。
在这种情况下,什么是最好的方法?

1l5u6lss

1l5u6lss1#

两种方法都行不通。不可能在Activity之外共享Fragment的示例。此外,你不应该在你的应用程序开发中这样做。这不是Android生态系统的设计方式。如果你想将同一个导航应用到多个屏幕,我看到了以下方法:
1.使用包含多个片段的容器片段。该片段将具有与片段之间的正确导航相关的逻辑。
1.对两个活动使用相同的导航图。- https://developer.android.com/guide/navigation/get-started

相关问题