我可以在 Fragments 构造函数中放入参数吗
Can I put arguments in my Fragments constructor
所以我有这样一个片段:
class MyFragment(val thing: SomeDataObject) : Fragment {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// do stuff using `thing`
}
}
然后我这样创建并附加它:
val myFragment = MyFragment(SomeDataObject())
supportFragmentManager.beginTransaction()
.replace(R.id.contentFrame, myFragment)
.commit()
我将变量 thing
作为参数 - 这似乎可行,但是我读到的关于将参数传递给片段的所有内容都说通过创建一个包并在片段实例。
按照我上面定义的方式进行操作有什么问题,或者使用捆绑包有什么好处吗?
只是好奇为什么其他地方都建议使用看似过于复杂的方式来传递参数...
片段需要有一个 0-arg 构造函数,以便框架可以为您重新创建它们,例如配置更改后。如果缺少 0-arg 构造函数,您将遇到崩溃。如果您同时拥有 0-arg 和 >0-arg 构造函数,则在调用 0-arg 构造函数时,在 >0-arg 中完成的任何初始化都将丢失。
Android也允许设置FragmentFactory,它将负责实例化Fragments。
使用 fragmentFactory 确保必要的依赖关系,特别是当依赖关系不是主要类型并且可以放入 bundle 并设置为片段参数时。
这也可以防止 activity 重新创建场景(屏幕 rotation/screen-zoom 等)的 运行 时间异常
可以查看 this 教程,了解如何将 fragmentFactory 用于参数化片段构造器场景。
所以我有这样一个片段:
class MyFragment(val thing: SomeDataObject) : Fragment {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// do stuff using `thing`
}
}
然后我这样创建并附加它:
val myFragment = MyFragment(SomeDataObject())
supportFragmentManager.beginTransaction()
.replace(R.id.contentFrame, myFragment)
.commit()
我将变量 thing
作为参数 - 这似乎可行,但是我读到的关于将参数传递给片段的所有内容都说通过创建一个包并在片段实例。
按照我上面定义的方式进行操作有什么问题,或者使用捆绑包有什么好处吗?
只是好奇为什么其他地方都建议使用看似过于复杂的方式来传递参数...
片段需要有一个 0-arg 构造函数,以便框架可以为您重新创建它们,例如配置更改后。如果缺少 0-arg 构造函数,您将遇到崩溃。如果您同时拥有 0-arg 和 >0-arg 构造函数,则在调用 0-arg 构造函数时,在 >0-arg 中完成的任何初始化都将丢失。
Android也允许设置FragmentFactory,它将负责实例化Fragments。
使用 fragmentFactory 确保必要的依赖关系,特别是当依赖关系不是主要类型并且可以放入 bundle 并设置为片段参数时。
这也可以防止 activity 重新创建场景(屏幕 rotation/screen-zoom 等)的 运行 时间异常
可以查看 this 教程,了解如何将 fragmentFactory 用于参数化片段构造器场景。