【问题标题】:Custom Dialog that close fragment关闭片段的自定义对话框
【发布时间】:2020-03-26 15:20:00
【问题描述】:

用户进行注册。我在 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()
}

这里是 SignActivity 中的 closeFragment:

fun closeFragment() {
    super.onBackPressed()
}
  • 我已经在 SignActivity 中覆盖了 onBackPressed,所以我又做了一个 方法。

当我点击“是”按钮时,这是一个错误

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 方法

如何通过单击对话框中的“是”按钮关闭片段?

【问题讨论】:

    标签: android android-studio kotlin dialog


    【解决方案1】:

    没有片段依赖的方法可能如下

    首先创建如下界面

    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 或任何其他片段分离。

    【讨论】:

    • context.closeThisFragment() 上有错误。它说智能转换为 'DialogListener' 是不可能的,因为 'context' 是一个具有开放或自定义 getter 的属性
    【解决方案2】:

    我想像这样重新开始我的活动:

    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 2018-03-04
      • 1970-01-01
      • 1970-01-01
      • 2016-05-21
      相关资源
      最近更新 更多