Пользовательский диалог, закрывающий фрагмент - PullRequest
0 голосов
/ 26 марта 2020

Пользователь делает регистрацию. Я сделал этот процесс в viewpager2. Пока пользователь регистрируется, он может выйти. Для этого есть соответствующая кнопка. Когда он нажмет на это, он получит диалоговое окно, которое спросит его: «Вы уверены?». Я хочу, чтобы у него был пользовательский вид. Итак, я создал класс kotlin для своего диалога. При нажатии на кнопку «Отмена» диалоговое окно будет закрыто. При нажатии на кнопку да фрагмент с viewpager2 закроется, и он придет к исходному фрагменту для входа в систему. У меня проблемы с последним. Вот мой класс диалога:

class AlertInterruptRegistration(context: Context) : Dialog(context){

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        requestWindowFeature(Window.FEATURE_NO_TITLE)
        setContentView(R.layout.alert_interrupt_registration)

        noButtonAIR.setOnClickListener{
            this.dismiss()
        }
        yesButtonAIR.setOnClickListener{
            SignUpFragment().closeThisFragment()
            this.dismiss()
        }
    }
}

Вот метод closeThisFragment:

fun closeThisFragment() {
    (activity as SignActivity).closeFragment()
}

Вот closeFragment в SignActivity:

fun closeFragment() {
    super.onBackPressed()
}
  • Я переопределил onBackPressed в SignActivity, поэтому я сделал для этого другой метод.

Когда я нажимаю кнопку YES, возникает ошибка

E/AndroidRuntime: FATAL EXCEPTION: main
       Process: com.samapps.myjami.dev, PID: 23417
       kotlin.TypeCastException: null cannot be cast to non-null type com.samapps.myjami.ui.activities.sign.SignActivity
            at com.samapps.myjami.ui.fragments.signup.SignUpFragment.closeThisFragment(SignUpFragment.kt:57)
            at com.samapps.myjami.ui.fragments.signup.alertstopregistr.AlertInterruptRegistration$onCreate$2.onClick(AlertInterruptRegistration.kt:22)
            at android.view.View.performClick(View.java:5647)
            at android.view.View$PerformClick.run(View.java:22465)
            at android.os.Handler.handleCallback(Handler.java:754)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:163)
            at android.app.ActivityThread.main(ActivityThread.java:6238)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:933)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
  • SignUpFragment.kt: 57 - это строка с методом closeThisFragment, а AlertInterruptRegistration.kt: 22 - это строка с методом yesButtonOnClickListener

Как закрыть фрагмент, нажав кнопку «Да» в диалоговом окне?

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Я просто перезапускаю свою деятельность так:

class AlertInterruptRegistration(context: Context, val activity: Activity) : Dialog(context) {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.alert_interrupt_registration)

        noButtonAIR.setOnClickListener {
            this.dismiss()
        }

        yesButtonAIR.setOnClickListener {
            this.dismiss()
            activity.finish()
            activity.startActivity(Intent(activity, SignActivity::class.java))
        }
    }
}

И вызываю мой диалог:

val a = AlertInterruptRegistration(context!!, activity!!)
a.show()
0 голосов
/ 26 марта 2020

Подход без вашей зависимости фрагмента может быть следующим:

Сначала создайте интерфейс, как показано ниже

interface DialogListener {
   fun closeThisFragment()
}  

Создайте SignInActivity реализуйте DialogListener

SignActivity: DialogListener

Переопределить closeThisFragment метод, как показано ниже

override fun closeFragment() {
    super.onBackPressed()
}

И, наконец, в диалоговом окне AlertInterruptRegistration добавьте следующую инструкцию

 yesButtonAIR.setOnClickListener{
        if(context is DialogListener){
             context.closeThisFragment()
         }
        this.dismiss()
    }

Преимущество использования этого подхода состоит в том, что ваш диалог отделен от SignUpFragment или любой другой фрагмент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...