我的项目有三个部分:一个进行计算的模型,一些显示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更改。我试图避免只是做一个循环并根据其状态更新所有元素,因为这将需要永远。 (虽然我认为这是我目前的唯一选择)
如果我不清楚,请告诉我,我会详细说明。