389 Stimmen

Zweimaliges Klicken auf die Zurück-Taste, um eine Aktivität zu beenden

Dieses Muster ist mir in letzter Zeit bei vielen Android-Apps und -Spielen aufgefallen: Wenn man auf die Schaltfläche "Zurück" klickt, um die Anwendung zu beenden, erscheint ein Toast erscheint eine Meldung ähnlich wie "Bitte klicken Sie zum Beenden erneut auf ZURÜCK".

Ich frage mich, da ich das immer häufiger sehe, ob das eine eingebaute Funktion ist, auf die man irgendwie in einer Aktivität zugreifen kann? Ich habe mir den Quellcode vieler Klassen angesehen, aber ich kann nichts darüber finden.

Natürlich kann ich über ein paar Möglichkeiten, die gleiche Funktionalität ganz leicht zu erreichen denken (die einfachste ist wahrscheinlich ein Boolean in der Aktivität zu halten, die anzeigt, ob der Benutzer bereits einmal geklickt...), aber ich war wundernd, wenn es etwas bereits hier ist.

EDITAR : Wie @LAS_VEGAS erwähnte, meinte ich nicht wirklich "Ausgang" in der traditionellen Bedeutung. (d.h. beendet) Ich meinte "zu dem zurückkehren, was vor dem Start der Anwendungsaktivität geöffnet war", wenn das Sinn macht :)

1voto

user2288580 Punkte 2000

Das Einzigartige an dieser Lösung ist das Verhalten, dass ein Nicht-Doppeltippen den Toast anzeigt und ein erfolgreiches Doppeltippen beim Schließen der App keinen Toast anzeigt. Der einzige Nachteil ist, dass die Anzeige des Toasts eine Verzögerung von 650 Millisekunden hat. Ich glaube, dass dies die beste Lösung mit dem besten Verhalten ist, da es logischerweise unmöglich wäre, dieses Verhalten ohne eine solche Verzögerung zu haben.

//App Closing Vars
private var doubleBackPressedInterval: Long = 650
private var doubleTap = false
private var pressCount = 0
private var timeLimit: Long = 0

override fun onBackPressed() {
    pressCount++
    if(pressCount == 1) {
        timeLimit = System.currentTimeMillis() + doubleBackPressedInterval
        if(!doubleTap) {
            showExitInstructions()
        }
    }
    if(pressCount == 2) {
        if(timeLimit > System.currentTimeMillis()) {
            doubleTap = true
            super.onBackPressed()
        }
        else {
            showExitInstructions()
        }
        pressCount = 1
        timeLimit = System.currentTimeMillis() + doubleBackPressedInterval
    }
}

private fun showExitInstructions() {
    Handler().postDelayed({
        if(!doubleTap) {
            Toast.makeText(this, "Try Agian", Toast.LENGTH_SHORT).show()
        }
    }, doubleBackPressedInterval)
}

1voto

maniix Punkte 51
boolean doubleBackToExitPressedOnce = false;

@Override
public void onBackPressed() {
    if (doubleBackToExitPressedOnce) {
        super.onBackPressed();
        return;
    }

    this.doubleBackToExitPressedOnce = true;

    Snackbar.make(findViewById(R.id.photo_album_parent_view), "Please click BACK again to exit", Snackbar.LENGTH_SHORT).show();

    new Handler().postDelayed(new Runnable() {

        @Override
        public void run() {
            doubleBackToExitPressedOnce=false;
        }
    }, 2000);
}

1voto

Karthik Kompelli Punkte 1817

Beste Lösung mit Toast

In Java

private Toast exitToast;

@Override
public void onBackPressed() {
    if (exitToast == null || exitToast.getView() == null || exitToast.getView().getWindowToken() == null) {
        exitToast = Toast.makeText(this, "Press again to exit", Toast.LENGTH_LONG);
        exitToast.show();
    } else {
        exitToast.cancel();
        super.onBackPressed();
    }
}

In Kotlin

private var exitToast: Toast? = null

override fun onBackPressed() {
    if (exitToast == null || exitToast!!.view == null || exitToast!!.view.windowToken == null) {
        exitToast = Toast.makeText(this, "Press again to exit", Toast.LENGTH_LONG)
        exitToast!!.show()
    } else {
        exitToast!!.cancel()
        super.onBackPressed()
    }
}

1voto

Divyang Panchal Punkte 1833

Einige Verbesserungen in Sudheesh B Nair's Antwort, ich habe bemerkt, dass es auf den Handler wartet, auch wenn man zweimal sofort zurück drückt, also den Handler wie unten gezeigt abbrechen. Ich habe Toast auch gecancelt, um zu verhindern, dass es nach dem Beenden der App angezeigt wird.

 boolean doubleBackToExitPressedOnce = false;
        Handler myHandler;
        Runnable myRunnable;
        Toast myToast;

    @Override
        public void onBackPressed() {
            if (doubleBackToExitPressedOnce) {
                myHandler.removeCallbacks(myRunnable);
                myToast.cancel();
                super.onBackPressed();
                return;
            }

            this.doubleBackToExitPressedOnce = true;
            myToast = Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT);
            myToast.show();

            myHandler = new Handler();

            myRunnable = new Runnable() {

                @Override
                public void run() {
                    doubleBackToExitPressedOnce = false;
                }
            };
            myHandler.postDelayed(myRunnable, 2000);
        }

1voto

Anuj Sain Punkte 143

Hier ist ein anderer Weg... mit dem CountDownTimer método

private boolean exit = false;
@Override
public void onBackPressed() {
        if (exit) {
            finish();
        } else {
            Toast.makeText(this, "Press back again to exit",
                    Toast.LENGTH_SHORT).show();
            exit = true;
            new CountDownTimer(3000,1000) {

                @Override
                public void onTick(long l) {

                }

                @Override
                public void onFinish() {
                    exit = false;
                }
            }.start();
        }

    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X