Android: 多个片段共享的函数放在哪里

Android: Where to put functions that multiple fragments share

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

有没有办法将这些函数放在一个地方并从我的片段中调用它们?这些函数与 navController 和 Toolbar Navigation 有关,所以我不能将它放在我的视图模型中。另一种解决方案可能是创建一个 Baseclass 片段,将这些函数放在那里并从中继承?

函数

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 体系结构或片段生命周期的解决方案。我正在使用 Jetpack 导航、mvvm 和匕首柄。

感谢您的帮助。

编辑:可能的解决方案

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。这就是为什么它里面有 initToolbar.

因此,如果您可以保证无论何时在任何调用站点上使用此方法,那么它都是有意义的,那么您可以为工具栏创建一个 top-level 扩展函数。

否则,您可以扩展工具栏并使用“复合 ViewGroup”来包含共享视图逻辑。