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

【Android】戻るボタンを2回押してアクティビティを閉じる方法|誤操作防止の実装テクニック

戻るボタンの誤操作による意図しない終了を防ぐ

スマートフォンを使用していると、うっかり戻るボタンを押してしまうことがあります。戻るボタンを1回押しただけでアプリが終了したり、別の画面へ遷移してしまうと、ユーザー体験を損なう原因になります。

そこで本記事では、「戻るボタンを2回連続で押すとアクティビティを閉じる」という、多くのアプリで採用されている定番のUXパターンを、サンプルコード付きで解説します。

実装手順

ステップ1: 新規プロジェクトを作成する

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

ステップ2: レイアウトファイル(activity_main.xml)

res/layout/activity_main.xmlに以下のコードを追加します。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:id="@+id/parent"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:gravity="center"
    android:background="#33FFFF00"
    android:orientation="vertical">

    <TextView
        android:id="@+id/text"
        android:textSize="18sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

ステップ3: MainActivity.java

src/MainActivity.javaに以下のコードを追加します。

package com.example.andy.myapplication;

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

public class MainActivity extends AppCompatActivity {

    // 2回押しと判定する間隔(ミリ秒)
    private static final int TIME_INTERVAL = 2000;
    private long mBackPressed;

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

    @Override
    public void onBackPressed() {
        if (mBackPressed + TIME_INTERVAL > System.currentTimeMillis()) {
            // 2秒以内に2回押された場合はアクティビティを終了
            super.onBackPressed();
            return;
        } else {
            // 1回目の押下時はトーストで通知
            Toast.makeText(getBaseContext(), "終了するにはもう一度押してください", Toast.LENGTH_SHORT).show();
        }
        // 戻るボタンが押された時刻を記録
        mBackPressed = System.currentTimeMillis();
    }
}

仕組みの解説

戻るボタンがタップされるとonBackPressed()メソッドが呼び出されます。このメソッド内では、直前に戻るボタンが押された時刻と現在時刻の差分を計算し、「一定時間(ここでは2秒)以内に2回連続で押されたかどうか」を判定しています。

  • 1回目の押下: トーストメッセージを表示し、押された時刻をmBackPressedに記録します。
  • 2回目の押下(2秒以内): super.onBackPressed()を呼び出してアクティビティを終了します。

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

それでは、実際にアプリを動かしてみましょう。実機のAndroid端末をパソコンに接続している前提で説明します。Android Studioでプロジェクトのアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックします。デバイスを選択して実行すると、端末には次のような画面が表示されます。

【Android】戻るボタンを2回押してアクティビティを閉じる方法|誤操作防止の実装テクニック

戻るボタンを1回押すと、上記のようにトーストメッセージが表示されます。続けてもう一度押すと、アプリが終了します。

補足: 新しいAndroidバージョンでの注意点

Android 13(API 33)以降、予測型「戻る」ジェスチャー(Predictive Back)への対応に伴い、onBackPressed()は非推奨(deprecated)となりました。AndroidXを使用する新しいプロジェクトでは、OnBackPressedDispatcherOnBackPressedCallbackを組み合わせた実装が推奨されています。

getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {

    private static final int TIME_INTERVAL = 2000;
    private long mBackPressed;

    @Override
    public void handleOnBackPressed() {
        if (mBackPressed + TIME_INTERVAL > System.currentTimeMillis()) {
            finish(); // 2回押されたので終了
        } else {
            Toast.makeText(getBaseContext(), "終了するにはもう一度押してください", Toast.LENGTH_SHORT).show();
        }
        mBackPressed = System.currentTimeMillis();
    }
});

判定ロジック自体は同じで、「2回目の押下かどうかを時間差で判定する」という考え方はそのまま活かせます。

  1. 【Android】ボタンの角を丸くする方法を徹底解説!カスタムドローアブルで実装する手順

    このチュートリアルでは、Androidアプリでボタンの角を丸く表示する方法を、実際のコード例とともにわかりやすく解説します。カスタムドローアブル(Drawable)を活用することで、通常時・フォーカス時・押下時といったボタンの状態に応じた角丸デザインも柔軟に実現できます。 手順1:Android Studioで新規プロジェクトを作成する まずはAndroid Studioを起動し、メニューから「File → New Project」を選択して新しいプロジェクトを作成しましょう。必要な項目をすべて入力し、プロジェクトのセットアップを完了させてください。 手順2:レイアウトファイル(activit

  2. 【Android】アクティビティでソフトキーボードの開閉リスナーを実装する方法

    この記事では、Androidアプリのアクティビティ内でソフトキーボード(SoftKeyboard)の表示・非表示を検知するリスナーを実装する方法を、サンプルコードとともにわかりやすく解説します。ソフトキーボードの開閉を検知するには、ViewTreeObserver.OnGlobalLayoutListener を利用して、画面の可視領域の変化を監視するのが一般的な手法です。手順1:新規プロジェクトの作成Android Studioを起動し、メニューから「File」→「New Project」を選択して、必要な項目を入力して新しいプロジェクトを作成します。手順2:レイアウトファイル(res/la