2012-12-22 12 views
8

Sono nuovo nello sviluppo di Android e lo voglio quando l'utente preme il pulsante Indietro sull'attività principale, viene visualizzato un messaggio di toast con "conferma uscita premendo nuovamente il pulsante Indietro" Messaggio. Come lo farei? Questo è quello che ho finora:Android - Conferma uscita app con pane tostato

@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

è la proiezione brindisi? Che cosa è/non funziona? Potrebbe essere meglio avere un segnalino lì e se il contatore = 2 poi finire. Oppure usa una finestra di dialogo invece di un brindisi – codeMagic

+0

Soluzione migliore in: http://stackoverflow.com/questions/8430805/android-clicking-twice-the-back-button-to-exit-activity – Webserveis

risposta

19

vorrei solo salvare il tempo della backpress e poi confrontare il tempo del l'ultimo comunicato alla nuova pressa.

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(); 
    } 
} 

Si può anche respingere il brindisi quando l'applicazione della stampa posteriore viene confermata (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

Grazie, questo è quello che ho volevo fare! Con un toast piuttosto che una finestra di dialogo :) – user1875797

+0

questa è la soluzione giusta per chi sta vagando su molti altri argomenti! – sandalone

+1

Vedere anche il miglioramento di user8218, che rimuove il brindisi non appena l'utente lo ripete la seconda volta: http://stackoverflow.com/a/18654014/199364 TUTTAVIA la risposta dell'utente8218 è SBAGLIATA come scritto; presentare un cambiamento che spiego in un commento a riguardo; spero che il mio cambiamento sarà accettato. – 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

Nella risposta precedente il brindisi viene creato solo sulla prima pressione indietro e il brindisi non viene annullato nella risposta. – Heinrisch

+0

[Inviato come una modifica] È possibile risolvere questo problema (per il commento di @Heinrisch) tenendo premuto il tasto tostato in un campo esterno al metodo: 'Toast onBackPressedToast;' prima del metodo. Quindi sposta 'onBackPressedToast = Toast ...' ALL'INTERNO 'if'. Nel 'else', proteggere l'annullamento con' if (onBackPressedToast! = Null) '. – ToolmakerSteve

+0

Anche bisogno di 'const int TOAST_DURATION = 5000;' – ToolmakerSteve

1

lavoro perfettamente nel mio caso

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

Si prega di spiegare le differenze dalla risposta più votata che esisteva due anni prima.Cosa c'è di diverso, e in che modo questo è un miglioramento rispetto a quella risposta? Inoltre, cosa giustifica rendere questa una nuova risposta, piuttosto che un commento su quella risposta? (IMHO, serve meglio i futuri lettori a suggerire * piccole * modifiche nei commenti su una risposta esistente, piuttosto che creare una risposta completamente nuova.) – ToolmakerSteve

0

In versione più recente è possibile utilizzare lo snack bar invece di pane tostato.

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

Dopo aver dovuto implementare lo stesso comportamento molte volte, ha deciso di andare aboiut la costruzione di una biblioteca per la stessa: DoubleBackPress Android Library. Fornisce molti modelli facili da usare e il comportamento della doppia contropressione senza tutti i problemi.

Basta fare:

// 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); 

Infine, ignorare il onBackPressed con il comportamento DoubleBackPress per la stampa di nuovo.

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

Example GIF for similar behaviour