2012-12-22 32 views
8

Android geliştirmeye yeni başladım ve kullanıcının ana etkinlik üzerindeki geri düğmesine basması durumunda, "arka tuşa tekrar basarak bir onaylama onaylama" mesajının görüntülendiğini istiyorum mesaj. Bunu nasıl yapardım?Android - tost ile app çıktısını onayla

@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

mi? Ne çalışıyor/çalışmıyor? Orada bir sayaç olması daha iyidir ve eğer karşı = 2 ise bitirirse. Veya bir tost yerine bir diyalog kullanın – codeMagic

+0

En iyi çözüm: http://stackoverflow.com/questions/8430805/android-clicking-twice-the-back-button-to-exit-activity – Webserveis

cevap

19

Sadece backpress zamanını kaydedin ve ardından yeni basına son basının zaman karşılaştırmak olacaktır: Bu defa ne var.

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

Ayrıca tost görevden olduğunda yine basın teyit edilmeyen uygulama (cred @ToolmakerSteve): mükemmel

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

Teşekkür ederim, ben buyum yapmak istiyordu! Bir iletişim kutusu yerine bir tost ile :) – user1875797

+0

Bu diğer birçok konuda gezinen olanlar için uygun bir çözüm! – sandalone

+1

Ayrıca, user8218'in bunu daha da geliştirerek, kullanıcının ikinci kez geri basmasıyla birlikte tostu kaldırması konusuna da bakın: http://stackoverflow.com/a/18654014/199364 HUSEVER user8218'in cevabı yazılı olarak WRONG'dur; bir yorumda açıkladığım bir değişiklik sunmak; umarım değişmem kabul edilir. – 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

Bir önceki cevapta, tost sadece ilk arka baskıda oluşturulur ve cevabınızdaki tost iptal edilmez. – Heinrisch

+0

[Bir düzenleme olarak gönderilmiştir] Bunu, yöntemin dışındaki bir alandaki tostu tutarak ("Hınnısch 'yorumuyla) düzeltin:" Tost onBackPressedToast; ". Daha sonra 'onBackPressedToast = Tost ... '' IN 'ibaresini hareket ettirin. “Else” de, iptal etmeyi “if (onBackPressedToast! = Null)' ile koruyun. – ToolmakerSteve

+0

Ayrıca int int TOAST_DURATION = 5000; ' – ToolmakerSteve

1

eser benim durumumda

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

Lütfen bundan iki yıl önce var olan en güçlü cevabın farklılıklarını açıklayınız.Farklı olan nedir ve bu cevap üzerinde nasıl bir gelişme var? Ayrıca, bu cevaba bir yorumdan ziyade, bunu yeni bir cevap haline getirmeyi haklı kılan nedir? (IMHO, gelecekteki okuyuculara, yepyeni bir cevap oluşturmaktan ziyade, mevcut bir cevap hakkındaki yorumlarda küçük değişiklikler * önermek için daha iyi hizmet vermektedir.) – ToolmakerSteve

0

yılında Daha yeni sürüm, tost yerine snackbar kullanabilirsiniz. DoubleBackPress Android Library:

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

birçok kez aynı davranışı uygulamak zorunda sonra aynı için bir kütüphane inşa aboiut gitmeye karar verdi. Tüm zorlukları ortadan kaldırmak için çok kolay kullanımlı şablonlar ve çift arka baskı özelliği sunar.

Hemen yapın:


// 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); 
Son olarak, arka basın için DoubleBackPress davranışı ile onBackPressed geçersiz kılar. tost gösteren

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

Example GIF for similar behaviour