web-dev-qa-db-fra.com

Ne fonctionne pas sur backpressed lorsque setcancelable of alertdialog est false

J'ai un AlertDialog et sa setCancelable() est fausse. Dans la fonction Onbackpressed, je veux que le AlertDialog soit fermé. Mais quand setCancelable() est faux, la touche retour ne fonctionne pas du tout. Que dois-je faire pour me débarrasser de ce problème? Je ne veux pas changer setCancelable() en true car j'aurai un autre problème.

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()
    }
}
9
MMG

il suffit d'ajouter un onKeyListener et d'annuler la boîte de dialogue sur l'événement de touche de retour.

    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
        }
    }
4
Alif Hasnain

si vous ne souhaitez pas fermer la boîte de dialogue lorsque vous touchez la zone extérieure de la boîte de dialogue, vous pouvez définir la propriété

    permissionDialog.setCanceledOnTouchOutside(false)

et si vous voulez fermer la boîte de dialogue sur backpress, vous devez appeler la méthode sur keyListener

 permissionDialog?.setOnKeyListener { dialog, keyCode, _ ->
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            dialog?.dismiss()
            true
        }
        false
    }
3
Raza
dialogBuilder.setOnKeyListener(object : OnKeyListener() {
            fun onKey(dialog: DialogInterface, keyCode: Int, event: KeyEvent?): Boolean {
                if (keyCode == KeyEvent.KEYCODE_BACK) {
//if you want to cancel the dialog only
                    dialog.cancel()
                    //if you want to finish then 
                   // finish()
                }
                return true
            }
        })
3
Wahdat Kashmiri