Android:将多个片段共享的功能放在哪里



我有三个片段,它们都有两个完全相同的函数。我的问题是,我(显然(不想一遍又一遍地复制同样的两个函数,并将其放入片段中。

难道没有办法把这些函数放在一个地方,然后从我的碎片中调用它们吗?这些功能与导航控制器和工具栏导航有关,所以我不能把它放在我的视图模型中。另一个解决方案可能是创建一个基类片段,将这些函数放在其中并从中继承?

功能

private fun initProgressbar(currentStateNumber: StateProgressBar.StateNumber, progressBarDescription: ArrayList<String>) =
state_progress_bar.apply {
setStateDescriptionData(progressBarDescription)
setCurrentStateNumber(currentStateNumber)
}
private fun initToolbar(navController: NavController, appBarConf: AppBarConfiguration, textToolbar: String?) =
toolbar.apply {
setupWithNavController(navController, appBarConf)
toolbar_title.text = textToolbar
}

我没有找到任何不违反mvvm架构或碎片生命周期的解决方案。我正在使用喷气背包导航,mvvm和dagger柄。

我感谢每一次帮助。

EDIT:可能的解决方案

abstract class BaseFragment(
layout: Int,
private val progressBarDescription: ArrayList<String>,
private val stateNumber: StateProgressBar.StateNumber
) : Fragment(layout) {
private val _navController: NavController by lazy { findNavController() }
private val appBarConf by lazy { AppBarConfiguration(_navController.graph) }
private val calibrateRepairToolbarText by lazy { arguments?.getString("calibrate_repair_toolbar_text") }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initProgressbar()
initToolbar()
}
val navController: NavController
get() = _navController
fun initProgressbar(): StateProgressBar = state_progress_bar.apply {
setStateDescriptionData(progressBarDescription)
setCurrentStateNumber(stateNumber)
}
fun initToolbar(): MaterialToolbar = toolbar.apply {
setupWithNavController(_navController, appBarConf)
toolbar_title.text = calibrateRepairToolbarText
}
}

然后在另一个片段中:

class Fragment(
private val progressBarDescription: ArrayList<String>,
@StateNumberOne private val stateNumber: StateProgressBar.StateNumber
) : BaseFragment(
R.layout.fragment_calibrate_repair_message,
progressBarDescription,
stateNumber
) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
}
}

您可以使用这些方法创建一个baseFragment,然后让您的三个Fragment扩展baseFragment

解决方案是这些initToolbar方法不属于Fragment,而是属于Toolbar。因此,它为什么有init工具栏

因此,如果您可以保证无论何时在任何调用站点上使用此方法,都是有意义的,那么您就可以为Toolbar创建一个顶级扩展函数。

否则,您可以扩展Toolbar并使用";复合视图组";以包含共享视图逻辑。

最新更新