sashimi4’s diary

日々の雑多なメモを書きます

よくある Press back again to exit なToastを再現してみる

現在携わっている業務アプリでは原則 onBackPressed をフックしてダイアログでの終了確認を行うようにしています。 が、終了確認ダイアログのNegativeButtonを毎度毎度押したくないので、よくある(?)あの「終了するにはもう一度押してください」というToastを再現してみました。

コード

package com.example.finishingconfirmsoftly;

import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    static final long SHORT_DURATION_TIMEOUT = 4000;
    static final long LONG_DURATION_TIMEOUT = 7000;
    boolean doubleBackToExitPressedOnce = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void onBackPressed() {
        if (doubleBackToExitPressedOnce) {
            super.onBackPressed();
            return;
        }

        this.doubleBackToExitPressedOnce = true;
        Toast doubleBackToExit
            = Toast.makeText(this, "Press back again to exit", Toast.LENGTH_SHORT);
        doubleBackToExit.show();

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                doubleBackToExitPressedOnce = false;
            }
        }, (doubleBackToExit.getDuration()
            == Toast.LENGTH_SHORT ? SHORT_DURATION_TIMEOUT : LONG_DURATION_TIMEOUT) / 2);
    }
}

まだ汎用化してないので絶妙に汚いですが :bow:

見た目

f:id:sashimi4:20181128184448g:plain

その他

参考: stackoverflow.com

参考: android.widget.Toastソースコード