Search code examples
androidkotlinandroid-alertdialogbackonbackpressed

Not working onbackpressed when setcancelable of alertdialog is false


I have an AlertDialog and its setCancelable() is false. In Onbackpressed function I want the AlertDialog to be closed. But when setCancelable() is false, the back key doesn't work at all. What should I do to get rid of this problem? I don't want to change setCancelable() to true because I will have another problem.

import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    lateinit var dialogBuilder: AlertDialog.Builder
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        dialogBuilder = AlertDialog.Builder(this)
        dialogBuilder.setMessage("Check your internet connection")
            .setPositiveButton("OK") { _, _ ->
                Toast.makeText(this, "OK", Toast.LENGTH_LONG).show()
            }.setCancelable(false)
            .create().show()
    }
}

Solution

  • just add a onKeyListener and cancel dialog on back key event.

        lateinit var dialog: AlertDialog
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            dialog = AlertDialog.Builder(this).setMessage("Check your internet connection")
                    .setPositiveButton("OK") { _, _ ->
                        Toast.makeText(this, "OK", Toast.LENGTH_LONG).show()
                    }.setCancelable(false)
                    .create()
            dialog.show()
    
            dialog.setOnKeyListener { _, keyCode, _ ->
                if(keyCode == KeyEvent.KEYCODE_BACK) {
                    if(dialog.isShowing) {
                        dialog.dismiss()
                    }
                }
                true
            }
        }