【发布时间】:2019-12-25 10:36:49
【问题描述】:
当你按下按钮打开一个单独的输入窗口时,有一个显示结果toast的功能。
class MainActivity : AppCompatActivity() {
val disposable = CompositeDisposable()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
val f = TestPopup()
usingRxJava(f)
//usingLiveData(f)
}
}
private fun usingRxJava(f: TestPopup) {
val subject = SingleSubject.create<String>()
f.show(supportFragmentManager, "TAG")
button.post {
f.dialog.setOnDismissListener {
val str = f.arguments?.getString(TestPopup.TEST_KEY) ?: ""
subject.onSuccess(str)
}
}
subject.subscribe({
Toast.makeText(this, "Accept : $it", Toast.LENGTH_SHORT).show()
}, {
}).addTo(disposable)
}
private fun usingLiveData(f: TestPopup) {
val liveData = MutableLiveData<String>()
f.show(supportFragmentManager, "TAG")
button.post {
f.dialog.setOnDismissListener {
val str = f.arguments?.getString(TestPopup.TEST_KEY) ?: ""
liveData.postValue(str)
}
}
liveData.observe(this, Observer {
Toast.makeText(this, "Accept : $it", Toast.LENGTH_SHORT).show()
})
}
override fun onDestroy() {
disposable.dispose()
super.onDestroy()
}
}
对话框片段
class TestPopup : DialogFragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.dialog_test, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
button_test.setOnClickListener {
val arg = Bundle()
arg.putString(TEST_KEY, edit_test.text.toString())
arguments = arg
dismiss()
}
}
companion object {
const val TEST_KEY = "KEY"
}
}
(示例项目网址:https://github.com/heukhyeon/DialogObserverPattern)
此示例代码在正常情况下有效。但是,经过以下过程,吐司不会浮动。
- 开发者选项 - 不要启用活动
- 打开 TestPopup,然后输入您的文本。 (不要按确定按钮)
- 按主页按钮将应用移至后台
- 应用被系统杀死。
- 重新激活应用(就像点击应用列表中的应用一样)
在这种情况下,我输入的文本仍保留在屏幕上,但当我按下 OK 按钮时没有任何反应。
我当然知道会发生这种情况,因为在活动结束时,活动和对话框之间的观察关系结束了。
大部分代码使用Activity中那个Dialog的回调接口的实现来处理这种情况。
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
button_test.setOnClickListener {
val input = edit_test.text.toString()
(activity as MyListener).inputComplete(input)
dismiss()
}
}
class MainActivity : AppCompatActivity(), TestPopup.MyListener {
override fun inputComplete(input: String) {
Toast.makeText(this, "Accept : $input", Toast.LENGTH_SHORT).show()
}
}
但我认为这是一种不符合观察者模式的方式,我想尽可能使用观察者模式来实现它。
我正在考虑从 FragmentManager 获取 Fragment 并在 onCreate 再次订阅,但我认为有更好的方法。
有人可以帮我吗?
【问题讨论】:
标签: dialog rx-java android-dialogfragment observer-pattern android-livedata