Как передать события / значения из alerttdialog или всплывающего окна в активность в Android MVP? - PullRequest
1 голос
/ 17 октября 2019

Я следую шаблону MVP для своего приложения, и у меня возникла путаница по поводу добавления прослушивателей событий в диалоговое окно оповещения, а также передачи значения текстового представления из диалогового окна оповещения обратно в операцию. Какой подход лучше? enter image description here

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Использование Listener - лучший подход. Как? Давайте посмотрим -

Я предполагаю, что вы используете настраиваемое диалоговое окно, для этого примените следующие шаги для получения правильных обратных вызовов -

  1. Создайте интерфейс внутри вашего CustomDialog классакоторый вернет вам событие обратного вызова.
  2. Реализация этого интерфейса в вашем Presenter / ViewModel классе.
  3. Теперь ваш Presenter / ViewModel Переопределите этот обратный вызовметод и отсюда вы можете использовать его для своей следующей задачи.
  4. Pass Presenter / ViewModel ссылка на ваш Custom Dialog как экземпляр интерфейса.
  5. Теперь вызовите интерфейсметод, в котором вы хотите использовать диалог.

Пример быстрого кода (в котлине)

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Это ответ, который вы ищете.

0 голосов
/ 17 октября 2019

Вы должны LayoutInflater, чтобы раздувать ваш диалог в представлении. Затем вы можете легко получить значение следующим образом:

LayoutInflater layoutInflater = LayoutInflater.from(context);
View view = layoutInflater.inflate(R.layout.dialog, null, false);
EditText textView = view.findViewById(R.id.editText);
String text = textView.getText();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...