Sudheesh B Nairの質問には良い(そして受け入れられた)回答があり、次のようなより良い選択肢があるはずです。
経過時間を測定しTIME_INTERVAL
、最後のバックプレスからミリ秒(2000年など)が経過したかどうかを確認することの何が問題になっていますか。次のサンプルコードはSystem.currentTimeMillis();
、時刻を格納するために使用さonBackPressed()
れます。
private static final int TIME_INTERVAL = 2000; // # milliseconds, desired time passed between two back presses.
private long mBackPressed;
@Override
public void onBackPressed()
{
if (mBackPressed + TIME_INTERVAL > System.currentTimeMillis())
{
super.onBackPressed();
return;
}
else { Toast.makeText(getBaseContext(), "Tap back button in order to exit", Toast.LENGTH_SHORT).show(); }
mBackPressed = System.currentTimeMillis();
}
受け入れられた回答批評に戻る。使用してflag
、それが最後に押されたかどうかを示すTIME_INTERVAL
(2000と言う)ミリ秒とセット-リセット経由でHandler
のpostDelayed()
方法は、私の心に来て最初のものでした。ただし、postDelayed()
アクティビティが閉じているときにアクションをキャンセルして、を削除する必要がありRunnable
ます。
を削除するためにはRunnable
、をanonymousと宣言してはならず、また、としてメンバーとして宣言する必要がありますHandler
。するとremoveCallbacks()
メソッドof Handler
を適切に呼び出すことができます。
次のサンプルはデモンストレーションです。
private boolean doubleBackToExitPressedOnce;
private Handler mHandler = new Handler();
private final Runnable mRunnable = new Runnable() {
@Override
public void run() {
doubleBackToExitPressedOnce = false;
}
};
@Override
protected void onDestroy()
{
super.onDestroy();
if (mHandler != null) { mHandler.removeCallbacks(mRunnable); }
}
@Override
public void onBackPressed() {
if (doubleBackToExitPressedOnce) {
super.onBackPressed();
return;
}
this.doubleBackToExitPressedOnce = true;
Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();
mHandler.postDelayed(mRunnable, 2000);
}
貢献してくれた@NSouthに感謝します。アプリケーションを閉じた後でもトーストメッセージが表示されないようにするためにToast
、メンバーとして宣言できます。たとえばmExitToast
、呼び出しのmExitToast.cancel();
直前にキャンセルできますsuper.onBackPressed();
。