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

0voto

Kaushik NP Punkte 6426

Nachdem ich die gleichen Dinge viele Male implementieren musste, habe ich beschlossen, dass es an der Zeit ist, dass jemand eine einfach zu verwendende Bibliothek erstellt. Und das ist DoubleBackPress Android library . Die README erklärt alle APIs, die zusammen mit Beispielen (wie ToastDisplay + Beenden Aktivität ), aber hier eine kurze Zusammenfassung der Schritte.


Um loszulegen, fügen Sie zunächst die dependency zu Ihrer Bewerbung:

dependencies {
    implementation 'com.github.kaushikthedeveloper:double-back-press:0.0.1'
} 

Als nächstes erstellen Sie eine DoubleBackPress Objekt in Ihrem Activity die das gewünschte Verhalten bietet.

DoubleBackPress doubleBackPress = new DoubleBackPress();
doubleBackPress.setDoublePressDuration(3000);           // msec

Dann erstellen Sie eine Toast die auf der Website angezeigt werden müssen Erste Rückenpresse . Hier können Sie Ihre eigene Toast , oder mit Standard Toast vorgesehen in der library . Dies geschieht hier durch die spätere Option.

FirstBackPressAction firstBackPressAction = new ToastDisplay().standard(this);
doubleBackPress.setFirstBackPressAction(firstBackPressAction);   // set the action

Legen Sie nun fest, was passieren soll, wenn Ihr zweiter Rückwärtsdruck erfolgt. Hier schließen wir die Aktivität.

DoubleBackPressAction doubleBackPressAction = new DoubleBackPressAction() {
    @Override
    public void actionCall() {
        finish();
        System.exit(0);
    }
};

Schließlich überschreiben Sie Ihr Verhalten beim Drücken der Rückseite mit der Option DoubleBackPress Verhalten.

@Override
public void onBackPressed() {
    doubleBackPress.onBackPressed();
}

Beispiel GIF für ähnliche Verhaltensanforderungen

0voto

mochadwi Punkte 984

Ich habe versucht, eine Utility-Klasse dafür zu erstellen, so dass jede Aktivität oder jedes Fragment dies implementieren kann, um es einfacher zu machen.

Der Code wurde mit Kotlin geschrieben und hat auch Java-Interop.

Ich verwende eine Coroutine zum Verzögern und Zurücksetzen der Flaggenvariable. Aber Sie können es an Ihre Bedürfnisse anpassen.

Zusätzliche Dateien : SafeToast.kt

lateinit var toast: Toast

fun Context.safeToast(msg: String, length: Int = Toast.LENGTH_LONG, action: (Context) -> Toast = default) {
    toast = SafeToast.makeText(this@safeToast, msg, length).apply {
        // do anything new here
        action(this@safeToast)
        show()
    }
}

fun Context.toastSpammable(msg: String) {
    cancel()
    safeToast(msg, Toast.LENGTH_SHORT)
}

fun Fragment.toastSpammable(msg: String) {
    cancel()
    requireContext().safeToast(msg, Toast.LENGTH_SHORT)
}

private val default: (Context) -> Toast = { it -> SafeToast.makeText(it, "", Toast.LENGTH_LONG) }

private fun cancel() {
    if (::toast.isInitialized) toast.cancel()
}

ActivityUtils.kt

@file:JvmMultifileClass
@file:JvmName("ActivityUtils")
package your.company.com

import android.app.Activity
import your.company.com.R
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

private var backButtonPressedTwice = false

fun Activity.onBackPressedTwiceFinish() {
    onBackPressedTwiceFinish(getString(R.string.msg_back_pressed_to_exit), 2000)
}

fun Activity.onBackPressedTwiceFinish(@StringRes message: Int, time: Long) {
    onBackPressedTwiceFinish(getString(message), time)
}

fun Activity.onBackPressedTwiceFinish(message: String, time: Long) {
    if (backButtonPressedTwice) {
        onBackPressed()
    } else {
        backButtonPressedTwice = true
        toastSpammable(message)
        GlobalScope.launch {
            delay(time)
            backButtonPressedTwice = false
        }
    }
}

Verwendung in Kotlin

// ActivityA.kt
override fun onBackPressed() {
    onBackPressedTwiceFinish()
}

Verwendung in Java

@Override 
public void onBackPressed() {
    ActivityUtils.onBackPressedTwiceFinish()
}

Dieser Code wurde inspiriert von @webserveis aquí

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