December 5, 2012

BACKキーで確認画面を表示する

BACKキーを押すと通常はそのActivityを終了して前のActivityに戻るといった動作をしますが、例えば、データ入力をするActivityでBACKキーを押されたとき、ポップアップを表示して入力をキャンセルして本当に前の画面に戻るかどうか促す、というUIにしたいときがあります。こういう処理をしたいときは、BACKキーのイベントをオーバーライドすることで自由に制御を変更して対応することができます。

例:BACKキーをおされたときにポップアップを表示してキャンセルか続行か促す




まずは、バックキーのイベントを取得して、ポップアップダイアログを表示します。ダイアログの結果を受け取って、キャンセルならfinish()でActivityを終了します。そうでなければ何もしません。

    @Override
    public boolean onKeyDown (int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            showAlert(mContext, new OnMyAlert() {
                @Override
                public void onResult(boolean isYes) {
                    if (isYes) {
                        finish();
                    }
                }
            });
        }
        return false;
    }

ポップアップダイアログを表示するメソッドです。Yes/Noの2つのボタンを表示して、結果を返します。

    private void showAlert(Context context, final OnMyAlert onMyAlert) {
        // Build
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle(R.string.warning);
        builder.setMessage(R.string.mes_warn_cancel);
        // Left button
        builder.setPositiveButton(R.string.answer_no, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                onMyAlert.onResult(false);
            }
        });
        // Right button
        builder.setNegativeButton(R.string.answer_yes, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                onMyAlert.onResult(true);
            }
        });
        // Show
        builder.create().show();
    }

結果を渡すためのインターフェースです。

public interface OnMyAlert {
    public abstract void onResult(boolean isYes);
}

No comments:

Post a Comment