Android
 Computer >> コンピューター >  >> プログラミング >> Android

Androidアプリで終了確認ダイアログを表示する方法|onBackPressedとAlertDialogの実装手順

概要

Androidアプリでは、誤って戻るボタンをタップしたことによる意図しない終了を防ぐため、「本当に終了しますか?」という確認ダイアログを表示するのが一般的なUX設計です。本記事では、onBackPressed()メソッドとAlertDialogを組み合わせて、アクティビティ終了前に確認ダイアログを表示する方法を、サンプルコードとともにステップごとに解説します。

Step 1:新規プロジェクトの作成

まず、Android Studioを起動し、メニューから「File」→「New Project」を選択します。必要な項目をすべて入力して、新しいプロジェクトを作成してください。

Step 2:レイアウトファイル(activity_main.xml)にコードを追加

res/layout/activity_main.xml に以下のコードを記述します。画面中央に説明用のTextViewを配置するシンプルな構成です。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:id="@+id/relativeLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Dialog to confirm that the user wishes to exit an Android Activity"
        android:textAlignment="center"
        android:textSize="24sp"
        android:textStyle="bold" />

</RelativeLayout>

Step 3:MainActivity.java にコードを追加

src/MainActivity.java に以下のコードを記述します。onBackPressed()をオーバーライドし、戻るボタンが押されたタイミングでAlertDialogを表示するのがポイントです。

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

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

    @Override
    public void onBackPressed() {
        new AlertDialog.Builder(this)
                .setIcon(android.R.drawable.ic_dialog_alert)
                .setTitle("Closing Activity")
                .setMessage("Are you sure you want to close this activity?")
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                        Toast.makeText(MainActivity.this, "Activity closed", Toast.LENGTH_SHORT).show();
                    }
                })
                .setNegativeButton("No", null)
                .show();
    }
}

※注意: 元のサンプルでは newAlertDialog.Builder(...) となっていますが、これは誤りです。new AlertDialog.Builder(this) のように、クラス名との間に半角スペースが必要です。また、メッセージ文字列内の "closethis activity" も "close this activity" に修正しています。

Step 4:AndroidManifest.xml にコードを追加

androidManifest.xml を以下のように記述します。通常、新規プロジェクト作成時に自動生成される内容とほぼ同じです。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

アプリを実行して動作を確認しよう

それでは、アプリケーションを実行してみましょう。実機のAndroidスマートフォンをパソコンに接続していることを前提としています。Android Studioからアプリを起動するには、プロジェクト内のいずれかのアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックします。デバイス選択画面で接続中のモバイル端末を選択すると、端末にデフォルト画面が表示されます。

Androidアプリで終了確認ダイアログを表示する方法|onBackPressedとAlertDialogの実装手順

この状態で端末の戻るボタンを押すと、「Closing Activity」というタイトルの確認ダイアログが表示されます。「Yes」をタップすればアクティビティが終了し、トーストで「Activity closed」と表示されます。「No」をタップすればダイアログが閉じられ、アプリはそのまま継続します。

コードのポイント解説

  • onBackPressed()のオーバーライド: 戻るボタンが押された際のデフォルト動作(アクティビティの即時終了)を上書きし、代わりにダイアログを表示します。
  • AlertDialog.Builder: アイコン・タイトル・メッセージ・ボタンをチェーン形式で設定できる便利なビルダークラスです。
  • setPositiveButton / setNegativeButton: 「Yes」ボタン押下時にfinish()を呼び出してアクティビティを終了し、「No」ボタンにはリスナーとしてnullを渡すことで、押しても何もせずダイアログを閉じるだけの挙動になります。

補足:新しいバージョンでの推奨実装

なお、APIレベル33(Android 13)以降ではonBackPressed()は非推奨(deprecated)となっています。予測型「戻る」ジェスチャーに対応するため、今後の開発ではOnBackPressedDispatcherを使用する方法が推奨されています。既存プロジェクトの保守であれば本記事の手法でも問題ありませんが、新規開発の場合は公式ドキュメントも併せて参照することをおすすめします。

  1. 【Android】ActionBarでメニュー項目を表示・非表示に切り替える方法

    ActionBarのメニュー項目を表示・非表示にする方法 このチュートリアルでは、AndroidのActionBar(アクションバー)上のメニュー項目を、ToggleButtonのオン/オフ操作に合わせて動的に表示・非表示する方法を解説します。 ポイントは、onCreateOptionsMenu()で生成されたMenuオブジェクトへの参照をフィールドに保持しておくことです。こうすることで、任意のタイミングでfindItem()により対象のMenuItemを取得し、setVisible()やsetEnabled()を呼び出して表示・有効状態を自由に切り替えられるようになります。 実装手順 ステ

  2. Androidでアクティビティ起動前にプログレスダイアログを表示する方法

    このチュートリアルでは、Androidアプリでアクティビティを起動する前にプログレスダイアログ(進行状況ダイアログ)を表示する方法を、実際のコード例とともにわかりやすく解説します。 実装のポイント ポイントは AsyncTask の onPreExecute() メソッド内でダイアログを表示することです。onPreExecute() はバックグラウンド処理が始まる直前にメインスレッド上で呼び出されるため、このタイミングで progressDialog.show() を呼び出せば、読み込み中であることをユーザーに伝えられます。 補足: ProgressDialog は API レベル 26 以降