类之间的Kotlin-android-extension通信类似于与其他片段进行通信

时间:2017-10-01 16:34:52

标签: android android-fragments interface kotlin kotlin-android-extensions

我的项目有三个部分:一个进行计算的模型,一些显示UI并将Trigger发送到我的第三部分的片段,主要活动。我使用Communicating with Other Fragments之类的接口完成了所有碎片。

但是现在我需要我的模型的一部分来触发一些UI更改。而且我不知道该怎么做。因为我的目标是让模型的一部分发送或触发一些功能,以便GUI得到更新,但它本身并不知道GUI。 (它完全独立于它) 在Main活动中,我覆盖所有函数

class MainActivity : AppCompatActivity(), MimaFragment.elementSelectedListener, InstructionFragment.instructionSaveButtonClickedCallback , OptionFragment.optionSaveButtonClickedCallback, MimaFragment.UITrigger{

override fun abortOptions() {
    extendNormal()
}

override fun updateMima() {
    mimaFragment.updateView()
}
override fun normal() {
        mimaFragment.drawArrows()
}}

片段exapmle:

class OptionFragment : Fragment() {
var optionCallback : optionSaveButtonClickedCallback? = null

interface optionSaveButtonClickedCallback{
        fun updateMima()
        fun abortOptions()
    }

override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
        view?.findViewById(R.id.optionsAbort)?.setOnClickListener{

            optionCallback?.abortOptions()
        }
    }

override fun onAttach(context: Context?) {
        super.onAttach(context)
        try {
            optionCallback = context as optionSaveButtonClickedCallback
        } catch (e : ClassCastException){
            throw ClassCastException(activity.toString() + " must implementoptionSaveButtonClickedCallback")
        }
    }
}

这就是你通常的做法,它运作正常。现在我的问题有没有办法像非Fragment类那样做?我试着这样:

class MimaModul(name: String, description : String, context: Context) : Element(name, description) {
 val uiTrigger : UITrigger? = null

init{
   try {
     uiTrigger = context as UITrigger
   } catch (e : ClassCastException){
     Log.d("ClassCastException","Didn't implement uiTrigger")
     }
}

 fun step(){
 //it does some stuff here and then calls for example
    uiTrigger?.normal()
 }

interface UITrigger{
   fun normal()
}
}

然而,正如我所料,UITrigger演员阵容不起作用。 (它总是有例外)你有什么想法如何解决这个问题。或者怎么做呢? 理想情况下,我希望MimaFragment实现该接口。但那也没有用。

class MimaFragment : Fragment(), MimaModul.UITrigger {
//other stuff
override fun normal() {
        drawArrows()
    }
}

因此,当我的模型完成一个步骤时,它应该触发一些UI更改。我试图避免只是做一个循环并根据其状态更新所有元素,因为这将需要永远。 (虽然我认为这是我目前的唯一选择)

如果我不清楚,请告诉我,我会详细说明。

0 个答案:

没有答案