No funciona en reprimido cuando setcancelable de alertdialog es falso

8

Tengo un AlertDialog y setCancelable()es falso. En Onbackpressedfunción, quiero que AlertDialog se cierre. Pero cuando setCancelable()es falso, la tecla de retroceso no funciona en absoluto. ¿Qué debo hacer para deshacerme de este problema? No quiero cambiar setCancelable()a verdadero porque tendré otro problema.

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()
    }
}
MMG
fuente
Edite su pregunta con el código
Wahdat Kashmiri
¿Este stackoverflow.com/a/25251122/5343866 responde a su pregunta?
animusmind
Agregue la respuesta que considere correcta para mi pregunta. Esa pregunta que señaló no tiene respuesta correcta. También por favor vote sobre mi pregunta. @animusmind
MMG
3
Hola, @MohammadMoeinGolchin, debes dejar de hablar de votos positivos y negativos. Este hábito está muy mal visto en StackOverflow. Permitir a los usuarios votar a su propio criterio; no necesitas hablar de votos en absoluto.
Taslim Oseni

Respuestas:

3

simplemente agregue un onKeyListener y cancele el diálogo en el evento de tecla de retroceso.

    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
        }
    }
Alif Hasnain
fuente
¿Es este código tanto para el diálogo de alerta como para el diálogo personalizado?
MMG
esto es para el diálogo de alerta
Alif Hasnain
No estoy seguro si esto funcionará en el diálogo personalizado.
Alif Hasnain
Creo que dijiste viceversa. Tiene un problema para el diálogo de alerta.
MMG
1
Gracias por tu buena respuesta, ¡la recompensa es tuya!
MMG
5

La solución más fácil para este problema es establecer OnKeyListenery detectar automáticamente cuándo el usuario presiona el botón Atrás.

Java:

public Dialog onCreateDialog(Bundle savedInstanceState) {

  Dialog dialog = super.onCreateDialog(savedInstanceState);

  dialog.setOnKeyListener(new Dialog.OnKeyListener() {
    @Override
    public boolean onKey(DialogInterface dialogInterface, int keyCode, KeyEvent keyEvent) {
        if (keyCode == KeyEvent.KEYCODE_BACK && keyEvent.getAction() == KeyEvent.ACTION_UP) {
          dialog.cancel;
          return true;
        }
        return false;
    }
  });

  return dialog;
}

Kotlin:

    dialog = AlertDialog.Builder(this)
            .setCancelable(false)
            .create()
    dialog.show()

    dialog.setOnKeyListener (object : Dialog.OnKeyListener { 
      override fun onKey(dialogInterface: DialogInterface, keyCode: Int, keyEvent: KeyEvent) {
        if(keyCode == KeyEvent.KEYCODE_BACK and keyEvent.action == KeyEvent.ACTION_UP) {
            dialog.dismiss()
            true
        }
        false
      }})

Tenga en cuenta que agregué una condición adicional en la instrucción if, todo lo que hace es asegurarse de que no se active dos veces.

Espero que esto te ayude.

Taslim Oseni
fuente
¿Es mi código en Java que me respondiste en Java? @ Taslim Oseni
MMG
He agregado una solución de Kotlin. ;-)
Taslim Oseni
1
¿Qué tipo de error está recibiendo? -Taslim Oseni responde @MohammadMoeinGolchin
Ali
Copie y pegue su código en Android Studio. Verá el error @ Ali
MMG
¿Viste el problema? @Ali
MMG
4

Cuando veo que crea dialogBuilder es público, ¿por qué no lo llama en un alertDialog público y luego lo muestra usando alertDilog.show () y cierra al presionar hacia atrás?

val alertDialog:AlertDialog?=null


         alertDialog = new AlertDialog.Builder(this)
        //set icon 
        .setIcon(android.R.drawable.ic_dialog_alert)
        //set title
        .setTitle("Are you sure to Exit")
        //set message
        .setMessage("Exiting will call finish() method")
        //set positive button
        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
        //set what would happen when positive button is clicked    
            finish();
        }
        })
        //set negative button
        .setNegativeButton("No", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
        //set what should happen when negative button is clicked
            Toast.makeText(getApplicationContext(),"Nothing 
          Happened",Toast.LENGTH_LONG).show();
         }
        })
        .show();

       onBackPress(){alertDialog.dismiss()}
Amit pandey
fuente
Hola y gracias por tu respuesta, mi código está en Kotlin, cuando convertí tu respuesta a Kotlin tiene un error. Le di un voto positivo por el tiempo que dedicó a que respondiera mi pregunta, si lo desea, puede votar mi pregunta
MMG
3
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
            }
        })
Wahdat Kashmiri
fuente
Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
Samuel Liew
3

si no desea cerrar el cuadro de diálogo cuando se toca fuera del área del cuadro de diálogo, puede establecer la propiedad

    permissionDialog.setCanceledOnTouchOutside(false)

y si desea cerrar el cuadro de diálogo en la contrapresión, debe llamar al método en keyListener

 permissionDialog?.setOnKeyListener { dialog, keyCode, _ ->
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            dialog?.dismiss()
            true
        }
        false
    }
Raza
fuente
Gracias Raza, mi código está en Kotlin, este código puede funcionar correctamente en Java.
MMG
permissionDialog es mi diálogo de alerta?
MMG
en lugar del generador de cuadros de diálogo, debe usar customDialog con diseño.
Raza
y sí permiso Dialog is alertDialog
Raza
Adjunte su código completo, tampoco se olvide de votar mi pregunta, arriba o abajo
MMG