389 Stimmen

Durch zweimaliges Klicken auf die Zurück-Schaltfläche verlassen Sie eine Aktivität.

Ich habe in letzter Zeit dieses Muster in vielen Android-Apps und Spielen bemerkt: Beim Klicken auf die Zurück-Schaltfläche, um die Anwendung zu "beenden", erscheint eine Toast mit einer Nachricht ähnlich wie "Bitte klicken Sie erneut auf ZURÜCK, um zu beenden".

Ich frage mich, da ich es immer öfter sehe, ob das eine eingebaute Funktion ist, auf die man auf irgendeine Weise in einer Aktivität zugreifen kann. Ich habe den Quellcode vieler Klassen durchgesehen, konnte jedoch nichts darüber finden.

Natürlich kann ich mir ein paar Möglichkeiten vorstellen, um die gleiche Funktionalität recht einfach zu erreichen (das einfachste ist wahrscheinlich, einen Boolean in der Aktivität zu halten, der anzeigt, ob der Benutzer bereits einmal geklickt hat...), aber ich frage mich, ob es bereits etwas gibt.

BEARBEITEN: Wie @LAS_VEGAS erwähnt hat, meinte ich mit "beenden" nicht im traditionellen Sinne. (d.h. beendet) Ich meinte "zurück zu dem, was geöffnet war, bevor die Startaktivität der Anwendung gestartet wurde", wenn das Sinn macht :)

0 Stimmen

[Android - Bestätigung des App-Austritts mit Toast] [1]: stackoverflow.com/questions/14006461/…

1 Stimmen

Ich hatte das gleiche Problem beim Verwenden der HoloEverywhere-Bibliothek, zu einfach können Sie android:launchMode="singleTask" zur Aktivitätsdefinition in der Manifestdatei hinzufügen.

0 Stimmen

7voto

Caner Punkte 53228

Es handelt sich nicht um eine integrierte Funktionalität. Ich glaube, es ist nicht einmal das empfohlene Verhalten. Android-Apps sind nicht dazu gedacht, beendet zu werden:

Warum bieten Android-Anwendungen keine "Beenden"-Option?

0 Stimmen

Punkt verstanden. Mit "Exit" meinte ich "Zurück zum Startbildschirm gehen"

3 Stimmen

Aber es ist immer noch keine eingebaute Funktionalität. Allerdings bin ich mir keiner Richtlinie dagegen bewusst. Als Android-Benutzer mag ich solche Funktionen.

6voto

Kartik Punkte 7547

Zefnus's Antwort mit System.currentTimeMillis() ist die beste (+1). Die Art und Weise, wie ich es gemacht habe, ist nicht besser als das, aber ich poste es trotzdem, um zu den obigen Ideen beizutragen.

Wenn der Toast beim Drücken der Zurück-Taste nicht sichtbar ist, wird der Toast angezeigt, während er sichtbar ist (die Zurück-Taste wurde bereits innerhalb der letzten Toast.LENGTH_SHORT Zeit gedrückt), wird er beendet.

exitToast = Toast.makeText(this, "Erneut drücken, um zu beenden", Toast.LENGTH_SHORT);
.
.
@Override
public void onBackPressed() {
   if (exitToast.getView().getWindowToken() == null) //wenn der Toast gerade nicht sichtbar ist
      exitToast.show();  //dann zeige Toast mit dem Hinweis 'Erneut drücken, um zu beenden'
   else {                                            //wenn der Toast sichtbar ist, dann
      finish();                                      //oder super.onBackPressed();
      exitToast.cancel();
   }
}

1 Stimmen

Ist eine gute Möglichkeit, dies zu tun, aber wenn Sie mehr Toast-Nachrichten haben, ist dies nicht der Fall.

0 Stimmen

@BoldijarPaul Nein, dieser Code überprüft nur den Status dieses spezifischen Toasts. Also werden andere Toasts das Verhalten nicht beeinflussen.

6voto

Tomasz Nguyen Punkte 2471

Kürzlich musste ich dieses Zurück-Taste-Feature in einer meiner Apps implementieren. Die Antworten auf die ursprüngliche Frage waren hilfreich, aber ich musste zwei weitere Punkte beachten:

  1. Zu einigen Zeitpunkten ist die Zurück-Taste deaktiviert
  2. Die Hauptaktivität verwendet Fragmente in Kombination mit einem Back-Stack

Basierend auf den Antworten und Kommentaren habe ich den folgenden Code erstellt:

private static final long BACK_PRESS_DELAY = 1000;

private boolean mBackPressCancelled = false;
private long mBackPressTimestamp;
private Toast mBackPressToast;

@Override
public void onBackPressed() {
    // Nichts tun, wenn die Zurück-Taste deaktiviert ist.
    if (!mBackPressCancelled) {
        // Fragment aus dem Back-Stack entfernen, wenn der Back-Stack nicht leer ist.
        if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
            super.onBackPressed();
        } else {
            if (mBackPressToast != null) {
                mBackPressToast.cancel();
            }

            long currentTimestamp = System.currentTimeMillis();

            if (currentTimestamp < mBackPressTimestamp + BACK_PRESS_DELAY) {
                super.onBackPressed();
            } else {
                mBackPressTimestamp = currentTimestamp;

                mBackPressToast = Toast.makeText(this, getString(R.string.warning_exit), Toast.LENGTH_SHORT);
                mBackPressToast.show();
            }
        }
    }
}

Der obige Code geht davon aus, dass die Support-Bibliothek verwendet wird. Wenn du Fragmente verwendest, aber nicht die Support-Bibliothek, musst du getSupportFragmentManager() durch getFragmentManager() ersetzen.

Entferne das erste if, wenn die Zurück-Taste nie abgebrochen wird. Entferne das zweite if, wenn du keine Fragmente oder einen Fragment-Back-Stack verwendest

Es ist auch wichtig zu beachten, dass die Methode onBackPressed seit Android 2.0 unterstützt wird. Überprüfe diese Seite für eine ausführliche Beschreibung. Um die Zurück-Taste-Funktion auch auf älteren Versionen zum Laufen zu bringen, füge der Aktivität folgende Methode hinzu:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ECLAIR
            && keyCode == KeyEvent.KEYCODE_BACK
            && event.getRepeatCount() == 0) {
        // Umgang mit dem Aufruf dieser Methode auf früheren Versionen
        // der Plattform, auf denen sie nicht existiert.
        onBackPressed();
    }

    return super.onKeyDown(keyCode, event);
}

6voto

Supto Punkte 984
  1. Deklarieren Sie eine globale Toast-Variablen für die MainActivity-Klasse. Beispiel: Toast exitToast;
  2. Initialisieren Sie diese in der onCreate-Methode. Beispiel: exitToast = Toast.makeText(getApplicationContext(), "Drücken Sie erneut zurück, um zu beenden", Toast.LENGTH_SHORT);
  3. Erstellen Sie schließlich eine onBackPressed-Methode wie folgt:

    @Override
    public void onBackPressed() {
    
        if (exitToast.getView().isShown()) {
            exitToast.cancel();
            finish();
        } else {
            exitToast.show();
        }
    }

Dies funktioniert korrekt, ich habe getestet. Und ich denke, dass dies viel einfacher ist.

6voto

Praveen Punkte 936

In Java

private Boolean exit = false; 

if (exit) {
onBackPressed(); 
}

@Override
public void onBackPressed() {
if (exit) {
finish(); // finish activity
} else {
Toast.makeText(this, "Drücken Sie erneut auf Zurück, um zu beenden.",
Toast.LENGTH_SHORT).show();
exit = true;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
exit = false;
}
}, 3 * 1000);

}
}

In Kotlin

private var exit = false

if (exit) {
onBackPressed()
}

override fun onBackPressed() {
if (exit) {
finish() // finish activity
} else {
Toast.makeText(this, "Drücken Sie erneut auf Zurück, um zu beenden.",
Toast.LENGTH_SHORT).show()
exit = true
Handler().postDelayed({ exit = false }, 3 * 1000)

}
}

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