Funktioniert nicht onbackpressed, wenn setcancelable von alertdialog false ist

8

Ich habe einen AlertDialog und er setCancelable()ist falsch. In der OnbackpressedFunktion möchte ich, dass der AlertDialog geschlossen wird. Aber wenn setCancelable()es falsch ist, funktioniert die Zurück-Taste überhaupt nicht. Was soll ich tun, um dieses Problem zu beseitigen? Ich möchte nicht setCancelable()zu true wechseln , da ich ein anderes Problem haben werde.

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
quelle
Bitte bearbeiten Sie Ihre Frage mit Code
Wahdat Kashmiri
Beantwortet dieser stackoverflow.com/a/25251122/5343866 Ihre Frage?
Animusmind
Bitte fügen Sie eine Antwort hinzu, die meiner Meinung nach für meine Frage richtig ist. Diese Frage, auf die Sie hingewiesen haben, hat keine richtige Antwort. Bitte stimmen Sie auch über meine Frage ab. @animusmind
MMG
3
Hey @MohammadMoeinGolchin, du musst aufhören über Upvoting und Downvoting zu reden. Diese Angewohnheit ist bei StackOverflow stark verpönt. Benutzern erlauben, nach eigenem Ermessen abzustimmen; Sie müssen überhaupt nicht über Stimmen sprechen.
Taslim Oseni

Antworten:

3

Fügen Sie einfach einen onKeyListener hinzu und brechen Sie den Dialog beim Zurück-Schlüsselereignis ab.

    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
quelle
Ist dieser Code sowohl für den Alarmdialog als auch für den benutzerdefinierten Dialog?
MMG
Dies ist für den Alarmdialog
Alif Hasnain
Ich bin mir nicht sicher, ob dies im benutzerdefinierten Dialog funktioniert.
Alif Hasnain
Ich denke du hast umgekehrt gesagt. Es gibt ein Problem mit dem Alarmdialog.
MMG
1
Vielen Dank für Ihre gute Antwort, das Kopfgeld gehört Ihnen!
MMG
5

Die einfachste Lösung für dieses Problem besteht darin, eine OnKeyListenerfestzulegen und automatisch zu erkennen, wenn der Benutzer die Zurück-Taste drückt.

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

Beachten Sie, dass ich der if-Anweisung eine zusätzliche Bedingung hinzugefügt habe. Dies muss lediglich sicherstellen, dass diese nicht zweimal ausgelöst wird.

Ich hoffe das hilft dir.

Taslim Oseni
quelle
Ist mein Code in Java, dass Sie mir in Java geantwortet haben ?! @ Taslim Oseni
MMG
Ich habe eine Kotlin-Lösung hinzugefügt. ;-)
Taslim Oseni
1
Welche Art von Fehler bekommen Sie in -Taslim Oseni Antwort @MohammadMoeinGolchin
Ali
Kopieren Sie seinen Code und fügen Sie ihn in Android Studio ein. Sie sehen den Fehler @ Ali
MMG
Hast du das Problem gesehen? @Ali
MMG
4

Wie ich sehe, erstellen Sie dialogBuilder ist öffentlich, warum rufen Sie dies nicht in einem öffentlichen alertDialog auf und zeigen es dann mit alertDilog.show () an und schließen Sie es auf pressClick in activity und schließen Sie den Dialog alertDilog.dismiss (), überschreiben Sie onBackPress und schließen Sie es hier

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
quelle
Hallo und danke für deine Antwort, mein Code ist in Kotlin, als ich deine Antwort in Kotlin konvertierte, ist ein Fehler aufgetreten. Ich habe Sie wegen der Zeit, die Sie für die Beantwortung meiner Frage aufgewendet haben, positiv bewertet. Wenn Sie möchten, können Sie über meine Frage abstimmen
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
quelle
Kommentare sind nicht für eine ausführliche Diskussion gedacht. Dieses Gespräch wurde in den Chat verschoben .
Samuel Liew
3

Wenn Sie den Dialog nicht schließen möchten, wenn Sie ihn außerhalb des Dialogbereichs berühren, können Sie die Eigenschaft festlegen

    permissionDialog.setCanceledOnTouchOutside(false)

und wenn Sie den Dialog beim Zurückdrücken schließen möchten, müssen Sie die Methode bei keyListener aufrufen

 permissionDialog?.setOnKeyListener { dialog, keyCode, _ ->
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            dialog?.dismiss()
            true
        }
        false
    }
Raza
quelle
Danke Raza, mein Code ist in Kotlin, dieser Code funktioniert möglicherweise korrekt in Java.
MMG
ErlaubnisDialog ist mein Alarmdialog?
MMG
Anstelle des Dialog Builders sollten Sie customDialog mit Layout verwenden.
Raza
und ja ErlaubnisDialog ist alertDialog
Raza
Bitte fügen Sie Ihren vollständigen Code bei, vergessen Sie auch nicht, über meine Frage nach oben oder unten abzustimmen
MMG