Использование Listener - лучший подход. Как? Давайте посмотрим -
Я предполагаю, что вы используете настраиваемое диалоговое окно, для этого примените следующие шаги для получения правильных обратных вызовов -
- Создайте интерфейс внутри вашего CustomDialog классакоторый вернет вам событие обратного вызова.
- Реализация этого интерфейса в вашем Presenter / ViewModel классе.
- Теперь ваш Presenter / ViewModel Переопределите этот обратный вызовметод и отсюда вы можете использовать его для своей следующей задачи.
- Pass Presenter / ViewModel ссылка на ваш Custom Dialog как экземпляр интерфейса.
- Теперь вызовите интерфейсметод, в котором вы хотите использовать диалог.
Пример быстрого кода (в котлине)
CustomDialog
class CustomDialog : DialogFragment() {
var listener: Listener? = null
var messageText = ""
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val builder = AlertDialog.Builder(this.activity)
val rootView = activity?.layoutInflater?.inflate(R.layout.dialog_custom, null)
isCancelable = false
val messageTextView: TextView? = rootView?.findViewById(R.id.messageTextView)
val okButton: Button? = rootView?.findViewById(R.id.okButton)
if (messageText.isNotBlank()) {
messageTextView?.text = messageText
}
okButton?.setOnClickListener {
listener?.customOkClicked()
dismiss()
}
builder.setView(rootView)
return builder.create()
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
dialog?.requestWindowFeature(Window.FEATURE_NO_TITLE)
dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
return super.onCreateView(inflater, container, savedInstanceState)
}
interface Listener {
fun customOkClicked()
}
}
YouPresenter
class MyPresenter: CustomDialog.Listener {
.
.
// other code
override fun customOkClicked() {
// your next step
}
}
YourActivity
class YourActivity: Activity() {
.
.
fun showCustomDialog() {
CustomDialog().apply {
this.listener = presenter // reference of your presenter class.
this.messageText = msg
}.show(supportFragmentManager, "custom_dialog_tag")
}
}
Примечание: Вы можете применить тот же подход с MVVM , сделайте то же самое с ViewModel в случае.
HopЭто ответ, который вы ищете.