2012-12-22 14 views
8

Ich bin neu in Android-Entwicklung und ich will es so, wenn der Benutzer die Zurück-Taste auf der Haupttätigkeit drückt, erscheint eine Toast-Nachricht mit einem "bestätigen beenden durch erneutes Drücken der Zurück-Taste" Botschaft. Wie würde ich das tun? Das ist, was ich habe, so weit:Android - Bestätigen App mit Toast

@Override 
public void onBackPressed() { 
    // TODO Auto-generated method stub 
    super.onBackPressed(); 
    Toast s = Toast.makeText(getBaseContext(), "Press back again to exit", Toast.LENGTH_LONG); 
    s.show(); 
    wait(); 

    public boolean onBackPressed() { 
     finish();  
    } 
} 
+0

Ist der Toast zeigt? Was funktioniert/funktioniert nicht? Es kann besser sein, einen Zähler dort zu haben, und wenn der Zähler = 2 ist, dann beende. Oder benutze einen Dialog statt einen Toast – codeMagic

+0

Beste Lösung in: http://stackoverflow.com/questions/8430805/android-clicking-twice-the-back-button-to-exit-activity – Webserveis

Antwort

19

Ich würde nur die Zeit des backpress speichern und vergleichen dann die Zeit der aktuellen Presse auf der neuen Presse.

long lastPress; 
@Override 
public void onBackPressed() { 
    long currentTime = System.currentTimeMillis(); 
    if(currentTime - lastPress > 5000){ 
     Toast.makeText(getBaseContext(), "Press back again to exit", Toast.LENGTH_LONG).show(); 
     lastPress = currentTime; 
    }else{ 
     super.onBackPressed(); 
    } 
} 

Sie können auch den Toast entlassen, wenn die App der Rückdruck wird bestätigt (CRED @ToolmakerSteve):

long lastPress; 
Toast backpressToast; 
@Override 
public void onBackPressed() { 
    long currentTime = System.currentTimeMillis(); 
    if(currentTime - lastPress > 5000){ 
     backpressToast = Toast.makeText(getBaseContext(), "Press back again to exit", Toast.LENGTH_LONG); 
     backpressToast.show(); 
     lastPress = currentTime; 
    } else { 
     if (backpressToast != null) backpressToast.cancel(); 
     super.onBackPressed(); 
    } 
} 
+0

Danke, das ist was ich wollte tun! Mit einem Toast anstatt einer Dialogbox :) – user1875797

+0

das ist die richtige Lösung für diejenigen, die auf viele andere Themen wandern! – sandalone

+1

Siehe auch die Erweiterung von user8218, die den Toast entfernt, sobald der Benutzer das zweite Mal drückt: http://StackOverflow.com/a/18654014/199364 Wie auch immer die Antwort von user8218 ist wie geschrieben FALSCH; eine Änderung einreichen, die ich in einem Kommentar dazu erläutere; Hoffentlich wird meine Änderung akzeptiert. – ToolmakerSteve

2
private long mLastPress = 0; 
const int TOAST_DURATION = 5000; 
Toast onBackPressedToast; 
@Override 
public void onBackPressed() { 
    long currentTime = System.currentTimeMillis(); 
    if (currentTime - mLastPress > TOAST_DURATION) { 
     onBackPressedToast = Toast.makeText(this, R.string.press_once_again_to_exit, Toast.LENGTH_SHORT); 
     onBackPressedToast.show(); 
     mLastPress = currentTime; 
    } else { 
     if (onBackPressedToast != null) { 
      onBackPressedToast.cancel(); //Difference with previous answer. Prevent continuing showing toast after application exit. 
      onBackPressedToast = null; 
     } 
     super.onBackPressed(); 
    } 
} 
+0

In der vorherigen Antwort wird der Toast nur beim ersten Drücken der Rücktaste erstellt und der Toast wird in Ihrer Antwort nicht gelöscht. – Heinrisch

+0

[Als Bearbeitung eingereicht] Kann dies beheben (per @Heinrisch' Kommentar), indem Toast in einem Feld außerhalb der Methode: Toast onBackPressedToast; vor der Methode. Dann verschiebe 'onBackPressedToast = Toast ...' INSIDE das 'if'. Im 'else', schützen Sie den Abbruch mit 'if (onBackPressedToast! = Null)'. – ToolmakerSteve

+0

Auch brauchen 'const int TOAST_DURATION = 5000;' – ToolmakerSteve

1

Arbeit perfekt in meinem Fall

private static long back_pressed; 

@Override 
public void onBackPressed() 
{ 
     if (back_pressed + 2000 > System.currentTimeMillis()) 
       super.onBackPressed(); 
     else 
      Toast.makeText(getBaseContext(), "Press once again to exit!", Toast.LENGTH_SHORT).show(); 
     back_pressed = System.currentTimeMillis(); 
} 
+0

Bitte erläutern Sie die Unterschiede zu der letzten Antwort, die zwei Jahre zuvor stattgefunden hat.Was ist anders und wie ist das eine Verbesserung gegenüber dieser Antwort? Was rechtfertigt es auch, dies zu einer neuen Antwort zu machen, anstatt einen Kommentar zu dieser Antwort zu geben? (IMHO, es dient eher zukünftigen Lesern, * kleine * Änderungen in Kommentaren zu einer bestehenden Antwort vorzuschlagen, anstatt eine ganz neue Antwort zu erstellen.) – ToolmakerSteve

0

In neuere Version können Sie die Snackbar anstelle von Toast verwenden.

import android.support.design.widget.Snackbar; 
... 
Snackbar.make(content, "Click BACK again to exit", Snackbar.LENGTH_SHORT).setAction("Action", null).show(); 
... 
0

Nachdem das gleiche Verhalten viele Male zu implementieren, entschied aboiut den Aufbau einer Bibliothek für das gleiche zu gehen: DoubleBackPress Android Library. Es bietet viele einfach zu verwendende Vorlagen und das doppelte Backpress-Verhalten ohne den ganzen Aufwand.

Just do:

// set the ToastDisplay to be shown on FirstBackPress 
FirstBackPressAction firstBackPressAction = new ToastDisplay().standard(this); 

// set the Action on DoubleBackPress 
DoubleBackPressAction doubleBackPressAction = new DoubleBackPressAction() { 
    @Override 
    public void actionCall() { 
     finish(); 
    } 
}; 

// setup DoubleBackPress behaviour 
DoubleBackPress doubleBackPress = new DoubleBackPress() 
     .withDoublePressDuration(3000) 
     .withFirstBackPressAction(firstBackPressAction) 
     .withDoubleBackPressAction(doubleBackPressAction); 

Schließlich wird das mit DoubleBackPress Verhalten für den Rücken drücken onBackPressed außer Kraft setzen.

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

Example GIF for similar behaviour