Dismiss AlertDialog from button in custom view

Viewed 2566

I have util class for dialogs with a function:

public static void buildCustomDialog(Context contextRef, View dialogContentView)
{
    AlertDialog.Builder builder = new AlertDialog.Builder(contextRef);

    builder.setView(dialogContentView);

    builder.setNegativeButton(contextRef.getString(R.string.std_cancel), null);

    AlertDialog dialog = builder.create();

    dialog.show();

}

and the view that I pass it has two buttons with clickListeners. Everything works great EXCEPT that I can't dismiss the dialog when the user clicks one of the custom buttons. So they navigate to another page, hit back and the dialog is still there.

How can I get a reference to the dialog in the custom clickListeners I'm creating before the dialog is made?

I've tried every conceivable option. My latest attempt is to make a custom DialogFragment with a custom interface but even then, the view (and hence the buttons and their listeners) get created before the AlertDialog builder creates the dialog.

I feel like this should be super simple and I'm missing something ...

3 Answers

In Kotlin something like this (using Anko dialogs) This shows list of buttons in custom layout, each closes dialog:

    private var closeDialogAction: () -> Unit = {}

    private fun showDialog(greetings: List<Greeting>) {
        val alert = context.alert {
            customView {
                verticalLayout {
                    greetings.forEach {
                        textView {                                 
                            text = it.name
                            setOnClickListener {
                                // Make some other necessary actions
                                closeDialogAction()
                            }
                        }
                    }
                }
            }
        }.build()

        closeDialogAction = {alert.dismiss()}

        alert.show()
    }
Related