Android:放置多个片段共享的功能的位置

问题描述

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

没有办法将这些功能放在一个地方并从我的片段中调用它们吗?这些功能与navController和工具栏导航有关,因此我无法将其放入视图模型中。另一个解决方案可能是创建一个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和dagger hilt。

感谢您的帮助。

编辑:可能的解决方案

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)
    }

}

解决方法

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

,

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

因此,如果您可以保证在任何调用站点上都使用此方法,那么就有意义,那么您可以为工具栏创建顶级扩展功能。

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...