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

18voto

Hugo Passos Punkte 7033

Sie können statt eines Toasts auch ein Snackbar verwenden, um sich auf deren Sichtbarkeit zu verlassen, um zu entscheiden, ob die App geschlossen werden soll oder nicht. Nehmen Sie dieses Beispiel:

Snackbar mSnackbar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final LinearLayout layout = findViewById(R.id.layout_main);
    mSnackbar = Snackbar.make(layout, R.string.press_back_again, Snackbar.LENGTH_SHORT);
}

@Override
public void onBackPressed() {
    if (mSnackbar.isShown()) {
        super.onBackPressed();
    } else {
        mSnackbar.show();
    }
}

3 Stimmen

Vielen Dank für diese Lösung. Einfach, effektiv, kein Risiko.

4 Stimmen

Out of box solution. (clap)

0 Stimmen

Einfach und großartig!! Aber das betrifft alle Navigationsrücktaste!

13voto

Mehul Joisar Punkte 15208

Aufgrund der korrekten Antwort und der Vorschläge in den Kommentaren habe ich eine Demo erstellt, die einwandfrei funktioniert und die Handler-Rückrufe nach ihrer Verwendung entfernt.

MainActivity.java

package com.mehuljoisar.d_pressbacktwicetoexit;

import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.widget.Toast;

public class MainActivity extends Activity {

    private static final long delay = 2000L;
    private boolean mRecentlyBackPressed = false;
    private Handler mExitHandler = new Handler();
    private Runnable mExitRunnable = new Runnable() {

        @Override
        public void run() {
            mRecentlyBackPressed=false;   
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void onBackPressed() {

        //You may also add condition if (doubleBackToExitPressedOnce || fragmentManager.getBackStackEntryCount() != 0) // in case of Fragment-based add
        if (mRecentlyBackPressed) {
            mExitHandler.removeCallbacks(mExitRunnable);
            mExitHandler = null;
            super.onBackPressed();
        }
        else
        {
            mRecentlyBackPressed = true;
            Toast.makeText(this, "drücken Sie erneut, um zu beenden", Toast.LENGTH_SHORT).show();
            mExitHandler.postDelayed(mExitRunnable, delay);
        }
    }

}

Ich hoffe, es wird hilfreich sein !!

0 Stimmen

Bist du sicher, dass das Entfernen des Handlers in onBackPressed() das Memory-Leak Problem behebt?

0 Stimmen

@Zefnus: Es wird behoben, so weit ich weiß. Korrigiere mich, wenn ich falsch liege. Wie haben Sie das Speicherproblem mit dem obigen Code nachverfolgt?

11voto

Rakshith Punkte 387
 public void onBackPressed() {
    if (doubleBackToExitPressedOnce) {
        super.onBackPressed();
        return;
    }

    this.doubleBackToExitPressedOnce = true;
    Toast.makeText(this, "Bitte klicken Sie erneut auf ZURÜCK, um zu beenden", Toast.LENGTH_SHORT).show();

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

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

Variable deklarierenprivate boolean doubleBackToExitPressedOnce = false;

Fügen Sie dies in Ihre Hauptaktivität ein, um das Problem zu lösen

10voto

Max Lee Punkte 189

Es ist keine gute Idee, ein Runnable zu verwenden, wenn die Anwendung verlassen wird. Ich habe kürzlich eine viel einfachere Möglichkeit herausgefunden, um die Zeit zwischen zwei BACK-Taste-Klicks aufzuzeichnen und zu vergleichen. Beispielimplementierung:

private static long back_pressed_time;
private static long PERIOD = 2000;

@Override
public void onBackPressed()
{
        if (back_pressed_time + PERIOD > System.currentTimeMillis()) super.onBackPressed();
        else Toast.makeText(getBaseContext(), "Drücken Sie erneut, um zu beenden!", Toast.LENGTH_SHORT).show();
        back_pressed_time = System.currentTimeMillis();
}

Dieser Code ermöglicht es, die Anwendung durch doppeltes Drücken der BACK-Taste innerhalb eines Zeitraums von 2000 Millisekunden zu beenden.

8voto

Pratik Butani Punkte 56577

Die akzeptierte Antwort ist die beste, aber wenn Sie die Android Design Support Library verwenden, können Sie Snackbar für bessere Ansichten verwenden.

boolean doubleBackToExitPressedOnce = false;

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

    this.doubleBackToExitPressedOnce = true;

    Snackbar.make(findViewById(R.id.photo_album_parent_view), "Bitte nochmal auf ZURÜCK klicken, um zu beenden", Snackbar.LENGTH_SHORT).show();

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

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

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