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

7voto

Caner Punkte 53228

Es handelt sich nicht um eine eingebaute Funktion. Ich denke, es ist nicht einmal das empfohlene Verhalten. Android-Apps sind nicht zum Beenden gedacht:

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

6voto

Kartik Punkte 7547

Zefnus Die Antwort mit System.currentTimeMillis() ist die beste (+1). Die Art und Weise, wie ich es gemacht habe, ist no besser als das, aber ich schreibe es trotzdem, um die obigen Ideen zu ergänzen.

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

exitToast = Toast.makeText(this, "Press again to exit", Toast.LENGTH_SHORT);
.
.
@Override
public void onBackPressed() {
   if (exitToast.getView().getWindowToken() == null) //if toast is currently not visible
      exitToast.show();  //then show toast saying 'press againt to exit'
   else {                                            //if toast is visible then
      finish();                                      //or super.onBackPressed();
      exitToast.cancel();
   }
}

6voto

Tomasz Nguyen Punkte 2471

Kürzlich musste ich diese Funktion der Zurück-Taste in einer meiner Anwendungen implementieren. Die Antworten auf die ursprüngliche Frage waren nützlich, aber ich musste noch zwei weitere Punkte berücksichtigen:

  1. Zu bestimmten Zeitpunkten ist die Zurück-Taste deaktiviert
  2. Die Hauptaktivität ist die Verwendung von Fragmenten in Kombination mit einem Backstack

Auf der Grundlage der Antworten und Kommentare 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() {
    // Do nothing if the back button is disabled.
    if (!mBackPressCancelled) {
        // Pop fragment if the back stack is not empty.
        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 setzt voraus, dass die Support-Bibliothek verwendet wird. Wenn Sie Fragmente, aber nicht die Unterstützungsbibliothek verwenden, müssen Sie die getSupportFragmentManager() von getFragmentManager() .

Entfernen Sie die erste if wenn die Rückwärtstaste nie aufgehoben wird. Entfernen Sie die zweite if wenn Sie keine Fragmente oder einen Fragment-Backstack verwenden

Außerdem ist es wichtig zu wissen, dass die Methode onBackPressed wird seit Android 2.0 unterstützt. Prüfen Sie diese Seite für eine ausführliche Beschreibung. Damit die Funktion "Zurückdrücken" auch bei älteren Versionen funktioniert, fügen Sie die folgende Methode zu Ihrer Aktivität 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) {
        // Take care of calling this method on earlier versions of
        // the platform where it doesn't exist.
        onBackPressed();
    }

    return super.onKeyDown(keyCode, event);
}

6voto

Supto Punkte 984
  1. Deklarieren Sie eine globale Toast-Variable für die MainActivity-Klasse. example: Toast exitToast;
  2. Initialisieren Sie es in der onCreate-Methode der Ansicht. example: exitToast = Toast.makeText(getApplicationContext(), "Press back again to exit", Toast.LENGTH_SHORT);
  3. Erstellen Sie schließlich eine onBackPressedMethod wie folgt:

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

Das funktioniert richtig, ich habe es getestet. und ich denke, das ist viel einfacher.

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, "Press Back again to Exit.",
                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, "Press Back again to Exit.",
                    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