非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

【Android開発】AlertDialog.Builderを用いたYes/Noメッセージダイアログ

   

Androidアプリ開発において、ユーザーに重要な操作の確認を求めたり情報を伝えたりする際に必須となるのがダイアログ(メッセージボックス)です。中でも、最も広く利用されているのが AlertDialog です。

「Yes」か「No」を選択させるシンプルな確認ダイアログを実装する方法についてメモしておきます。

// MainActivity.java

import androidx.appcompat.app.AlertDialog;
import android.content.DialogInterface;
import android.util.Log;
import android.view.View;
import android.widget.Button;

// ... アクティビティのどこかで実行されるメソッド内 ...

private void showConfirmationDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this); // 'this' はActivityのコンテキスト

    builder.setTitle("操作の確認");
    builder.setMessage("本当に削除してもよろしいですか?");

    // はい (Yes) ボタン
    builder.setPositiveButton("はい", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // Yes (はい) が押された時の処理
            Log.d("Dialog", "削除処理を実行します。");
            // 例: データの削除処理を呼び出す
        }
    });

    // いいえ (No) ボタン
    builder.setNegativeButton("いいえ", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // No (いいえ) が押された時の処理
            Log.d("Dialog", "削除をキャンセルしました。");
            dialog.dismiss(); // ダイアログを閉じる
        }
    });

    // ダイアログを作成して表示
    AlertDialog dialog = builder.create();
    dialog.show();
}

// 例: あるボタンが押されたときにダイアログを表示する
// @Override
// protected void onCreate(Bundle savedInstanceState) {
//     super.onCreate(savedInstanceState);
//     setContentView(R.layout.activity_main);
//     Button myButton = findViewById(R.id.my_button);
//     myButton.setOnClickListener(new View.OnClickListener() {
//         @Override
//         public void onClick(View v) {
//             showConfirmationDialog(); // ダイアログ表示メソッドを呼び出す
//         }
//     });
// }
 

 

こんなメッセージが現れます。

 

尚、デスクトップアプリに慣れている人はメソッドの独立性を求めたくなり、メソッドにタイトルとメッセージ内容を渡し、YesならTrue, NoならFalseを返すようにしたくなります。

しかし、それはAndroidの非同期処理の仕組み上、標準のAlertDialog.Builderを使用した方法では非常に難しいです。Androidのダイアログ表示はユーザーの操作を待たずにすぐに次のコード行に進んでしまう非同期処理だからです。

dialog.show() を呼び出した瞬間にメソッドはすぐに終了し処理はダイアログが閉じられるのを待たずに次の行に進みます。ユーザーが「Yes」「No」をクリックするまでには時間がかかりますが、一方でJava/Kotlinのメソッドは実行されたらすぐに値を返さなければならないという制約があります。さらに、ユーザーの応答を待って処理を停止(ブロック)させることは、ANR (Application Not Responding) を引き起こすためAndroid開発では禁止されています。

デスクトップアプリとは、この辺りが大きく異なるので注意が必要です。

 

スポンサーリンク

 - Androidプログラミング