首页 > 解决方案 > 如何从android中的片段中获取静态记录器?

问题描述

这是我想做的事情:

我有一个基本上没有任何 GUI 的应用程序,只是在后台发生了很多事情(应用程序基本上只是相机的 LAN 遥控器,所以我有相机类、网络类等在后台运行。但是, 我想TextView在我的 GUI 上有一个简单的, 它将显示某种日志。我所有的类都应该有权访问这个日志并添加/写入东西。由于我的 GUI 只包含一个文本视图,我不想要打扰 MVVM,这将是我的首选 GUI 模式。

到目前为止我所拥有的:

对于 TextView,我创建了一个片段:

class GUIFragment : Fragment(R.layout.gui_fragment) {


    // other class members
    private lateinit var logger : Logger

    private var _binding: GuiFragmentBinding? = null
    private val guiBinding get() = _binding!!

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        retainInstance = true
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        //set up bindings
        _binding = GuiFragmentBinding.inflate(inflater, container, false)
        guiBinding.logviewer.movementMethod = ScrollingMovementMethod()
        logger = Logger(guiBinding.logviewer)
        return guiBinding.root


    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }

    // other logic 

    companion object {
        fun getLogger() : Logger?{
            return null // or my logger instance
        }
    }
}

这里的想法是有一个静态方法,它返回片段logger实例或 null (因为 GUI 根本没有改变,它实际上应该总是返回logger实例。它logger本身是片段的成员并获得绑定TextView传递给它的构造函数。但是,我认为伴随对象无法访问类成员(这是有道理的,因为它们不是静态的)?我的logger成员也应该是静态的,但是我应该如何传递TextView给它呢?

为了完整起见,这里也是Logger类:

class Logger (_tv : TextView) {

    private val maxLogLines = 100
    private val tv = _tv

    suspend fun log(msg: String?) = withContext(Dispatchers.Main){
        var logtext = tv.text.toString()
        logtext = logtext.plus("${msg}\n")
        var split = logtext.split("\n")


        if (split.count() >= maxLogLines) {
            logtext = split.slice(1 until (maxLogLines - 1)).joinToString("\n")
        }
        tv.text = logtext
    }
}

标签: androidkotlincompanion-object

解决方案


推荐阅读