適切な「戻る」ナビゲーションを提供する

「戻る」ナビゲーションとは、ユーザーがこれまでにアクセスした画面の履歴を遡って移動する機能です。すべての Android デバイスには、このタイプの [戻る] ボタンがあります。 アプリの UI には [戻る] ボタンを追加しないでください。ユーザーの Android デバイスによっては、このボタンが物理ボタンの場合もあれば、ソフトウェア ボタンの場合もあります。

Android は、ユーザーがアプリ内を移動する際、デスティネーションのバックスタックを保持します。これにより、Android は [戻る] ボタンを押すと、前に移動したデスティネーションが表示されます。他にも アプリに独自の「戻る」動作を実装して、 最適なユーザーエクスペリエンスを提供できます

たとえば、WebView を使用する場合、 デフォルトの [戻る] ボタンの動作をオーバーライドして、 前の画面ではなくウェブ閲覧履歴をさかのぼって移動する 説明します

Android 13 以降には、Android デバイス向けの予測型「戻る」ジェスチャーがあります。宛先 この機能について詳しくは、予測型「戻る」ジェスチャーのサポートを追加するをご覧ください。

カスタムの「戻る」ナビゲーションを実装する

ComponentActivity: ベース FragmentActivity のクラス および AppCompatActivity、 を使用すると、[戻る] ボタンの動作を OnBackPressedDispatcher これは getOnBackPressedDispatcher() を呼び出して取得できます。

OnBackPressedDispatcher は、[戻る] ボタンイベントを 1 つまたは複数の OnBackPressedCallback オブジェクトにディスパッチする方法を制御します。OnBackPressedCallback のコンストラクタは、初期有効状態のブール値を取ります。コールバックが有効な場合、つまり isEnabled() true を返します。ディスパッチャは、 handleOnBackPressed() [戻る]ボタンイベントを処理します有効状態を変更するには、setEnabled() を呼び出します。

コールバックは、addCallback メソッドを使用して追加します。Google Cloud コンソールの addCallback() メソッド。これは LifecycleOwner を受け取ります。 これにより、LifecycleOwnerLifecycle.State.STARTED の場合に限り、OnBackPressedCallback が追加されるようになります。また、アクティビティは、登録済みのコールバックが LifecycleOwner が破棄されます。これにより、メモリリークを防ぎ、 LifecycleOwner に適しています 存続期間が短いフラグメントや他のライフサイクル所有者向け 表します。

コールバックの実装例を次に示します。

Kotlin

class MyFragment : Fragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // This callback is only called when MyFragment is at least started
        val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
            // Handle the back button event
        }

        // The callback can be enabled or disabled here or in the lambda
    }
    ...
}

Java

public class MyFragment extends Fragment {

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // This callback is only called when MyFragment is at least started
        OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) {
            @Override
            public void handleOnBackPressed() {
                // Handle the back button event
            }
        };
        requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);

        // The callback can be enabled or disabled here or in handleOnBackPressed()
    }
    ...
}

addCallback() を使用して複数のコールバックを指定できます。 その場合、指定した順序とは逆の順序でコールバックが呼び出されます。 最後に追加されたコールバックが、 [戻る] ボタンのイベント。たとえば、3 つのコールバックを onetwothree の順番で呼び出されます。 threetwoone

コールバックは、「チェーン オブ レスポンシビリティ」パターンに従います。チェーン内の各コールバックが呼び出されるのは、前のコールバックが有効になっていない場合に限られます。つまり、 上記の例では、コールバック two が呼び出されるのは、コールバック three が 有効ではなく、コールバック one はコールバック two の場合にのみ呼び出されます 有効になっていません。

なお、addCallback() を使用してコールバックを追加すると、 責任のチェーンには追加されませんが、 LifecycleOwnerLifecycle.State.STARTED 状態になります。

OnBackPressedCallback の有効な状態を変更することをおすすめします。 一時的な変更に対して使用しないでください。そうすることで、上記の順序が維持されます。 これは、コールバックを複数のイベントに登録している場合に特に重要です。 ライフサイクル所有者を指定できます

OnBackPressedCallback を完全に削除する場合は、次のようにします。 呼び出して remove()。 コールバックは自動的に削除されるため、通常はこの操作を行う必要はありません。 関連付けられているLifecycleOwner: 破棄されます。

onBackPressed() アクティビティ

以下を使用している場合: onBackPressed() [戻る] ボタンイベントを処理するには、 代わりに OnBackPressedCallback してください。 ただし、この変更ができない場合は、次のルールが適用されます。

  • addCallback を通じて登録するコールバックはすべて、super.onBackPressed() を呼び出したときに評価されます。
  • Android 12(API レベル 32)以前では、登録された OnBackPressedCallback インスタンスに関係なく、常に onBackPressed が呼び出されます。