Não está funcionando quando pressionado quando setcancelable of alertdialog é false

8

Eu tenho um AlertDialog e setCancelable()é falso. Na Onbackpressedfunção, quero que o AlertDialog seja fechado. Mas quando setCancelable()é falso, a tecla Voltar não funciona. O que devo fazer para me livrar desse problema? Não quero mudar setCancelable()para true porque terei outro 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
fonte
Edite sua pergunta com o código
Wahdat Kashmiri 15/03
Este stackoverflow.com/a/25251122/5343866 responde à sua pergunta?
animusmind 15/03
Por favor, adicione a resposta que você acha correta para minha pergunta. Essa pergunta que você apontou não tem resposta correta. Também vote na minha pergunta. @animusmind
MMG
3
Ei, @MohammadMoeinGolchin, você precisa parar de falar sobre voto positivo e voto negativo. Esse hábito é muito desaprovado no StackOverflow. Permitir que os usuários votem a seu próprio critério; você não precisa falar sobre votos.
Taslim Oseni 15/03

Respostas:

3

basta adicionar um onKeyListener e cancelar a caixa de diálogo no evento de tecla Voltar.

    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
fonte
Esse código é para o diálogo de alerta e o diálogo personalizado?
MMG 15/03
isto é para alerta
Alif Hasnain 15/03
não tenho certeza se isso funcionará na caixa de diálogo personalizada.
Alif Hasnain 15/03
Eu acho que você disse vice-versa. Tem problema para o diálogo de alerta.
MMG 15/03
1
Obrigado pela sua boa resposta, a recompensa é sua!
MMG 22/03
5

A solução mais fácil para esse problema é definir OnKeyListenere detectar automaticamente quando o usuário pressionar o botão Voltar.

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
      }})

Observe que eu adicionei uma condição extra na instrução if, tudo o que faz é garantir que isso não seja acionado duas vezes.

Espero que isso ajude você.

Taslim Oseni
fonte
É o meu código em Java que você me respondeu em Java?! @ Taslim Oseni
MMG
Eu adicionei uma solução Kotlin. ;-)
Taslim Oseni 15/03
1
Que tipo de erro você está recebendo? -Taslim Oseni responde @MohammadMoeinGolchin
Ali
Copie e cole seu código no Android Studio. Você verá o erro @ Ali
MMG
Você viu o problema? @Ali
MMG
4

Como vejo que você cria dialogBuilder é público, por que não chamar isso em um alertDialog público e depois mostrá-lo usando alertDilog.show () e fechar novamente? Clique em atividade e ignore o diálogo alertDilog.dismiss () substitua o onBackPress e o ignore aqui

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
fonte
Olá e obrigado pela sua resposta, meu código está no Kotlin. Quando converti sua resposta para o Kotlin, ocorreu um erro. Eu te dei voto positivo por causa do tempo que você gastou para eu responder minha pergunta, se quiser, você pode votar na minha pergunta
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
fonte
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Samuel Liew
3

se você não quiser fechar a caixa de diálogo quando tocar em sua área externa, poderá definir a propriedade

    permissionDialog.setCanceledOnTouchOutside(false)

e se você quiser descartar a caixa de diálogo ao pressionar back-end, precisará chamar o método em keyListener

 permissionDialog?.setOnKeyListener { dialog, keyCode, _ ->
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            dialog?.dismiss()
            true
        }
        false
    }
Raza
fonte
Obrigado Raza, meu código está no Kotlin, esse código pode funcionar corretamente em Java.
MMG 17/03
permissionDialog é a minha caixa de diálogo de alerta?
MMG
em vez do construtor de diálogo, você deve usar customDialog com layout.
Raza
e sim permissionDialog é AlertDialog
Raza
Anexe seu código completo, também não se esqueça de votar na minha pergunta, para cima ou para baixo
MMG