关闭片段的自定义对话框
Custom Dialog that close fragment
用户进行注册。我在viewpager2中做了这个过程。当用户注册时,他可以退出。为此有适当的按钮。当他点击这个时,他会收到一个对话框,询问他 "Are you sure??"。我希望它有自定义视图。因此,我为我的对话框创建了 kotlin class。单击取消按钮,对话框将关闭。单击按钮是,带有 viewpager2 的片段将关闭,他将回到主页片段进行登录。我有最后的问题。这是我的对话框 class:
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.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 方法
如何通过单击对话框中的是按钮关闭片段?
不依赖片段的方法可能如下
首先创建如下界面
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
或任何其他片段分离。
我想出了像这样重新启动我的 activity:
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()
用户进行注册。我在viewpager2中做了这个过程。当用户注册时,他可以退出。为此有适当的按钮。当他点击这个时,他会收到一个对话框,询问他 "Are you sure??"。我希望它有自定义视图。因此,我为我的对话框创建了 kotlin class。单击取消按钮,对话框将关闭。单击按钮是,带有 viewpager2 的片段将关闭,他将回到主页片段进行登录。我有最后的问题。这是我的对话框 class:
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.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 方法
如何通过单击对话框中的是按钮关闭片段?
不依赖片段的方法可能如下
首先创建如下界面
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
或任何其他片段分离。
我想出了像这样重新启动我的 activity:
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()