Search code examples
androidkotlinandroid-alertdialogandroid-dialogfragment

How to forbid user to close alert dialog touching outside it?


I have this dialog fragment class:

class AskDownloadFragment : DialogFragment() {
private lateinit var navController: NavController
private lateinit var mainActivity: MainActivity

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {

    mainActivity = activity as MainActivity

    return activity.let {
        // Use the Builder class for convenient dialog construction
        AlertDialog.Builder(it).setMessage(R.string.want_to_download)
            .setNegativeButton(R.string.no) { _, _ ->
                dismiss()
            }

            .setPositiveButton(R.string.yes) { _, _ ->
                dismiss()
                mainActivity.showDownloadDialog()
            }
            .setCancelable(false)

            // Create the AlertDialog object and return it
            .create()
    }
}

}
And I cal it this way:

AskDownloadFragment().show(supportFragmentManager, DialogTags.TAG_ASK_DOWNLOAD.toString())

I can see the dialog on the screen, but I'm still able to close it touching outside alertDialog. What can I do?


Solution

  • Just simply use this key

    .setCanceledOnTouchOutside(false)
    

    So overall it will be like

    class AskDownloadFragment : DialogFragment() {
    private lateinit var navController: NavController
    private lateinit var mainActivity: MainActivity
    
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    
        mainActivity = activity as MainActivity
    
        return activity.let {
                // Use the Builder class for convenient dialog construction
                val dialog = AlertDialog.Builder(it).setMessage(R.string.want_to_download)
                        .setNegativeButton(R.string.no) { _, _ ->
                            dismiss()
                        }
    
                        .setPositiveButton(R.string.yes) { _, _ ->
                            dismiss()
                            mainActivity.showDownloadDialog()
                        }
                        .setCancelable(false)
                       
    
                        // Create the AlertDialog object and return it
                        .create()
                dialog.setCanceledOnTouchOutside(false)
                dialog
            }
    }