「戻る」ナビゲーションとは、ユーザーがこれまでにアクセスした画面の履歴を遡って移動する機能です。すべての 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
を受け取ります。
これにより、LifecycleOwner
が Lifecycle.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 つのコールバックを
one
、two
、three
の順番で呼び出されます。
three
、two
、one
。
コールバックは、「チェーン オブ レスポンシビリティ」パターンに従います。チェーン内の各コールバックが呼び出されるのは、前のコールバックが有効になっていない場合に限られます。つまり、
上記の例では、コールバック two
が呼び出されるのは、コールバック three
が
有効ではなく、コールバック one
はコールバック two
の場合にのみ呼び出されます
有効になっていません。
なお、addCallback()
を使用してコールバックを追加すると、
責任のチェーンには追加されませんが、
LifecycleOwner
が Lifecycle.State.STARTED
状態になります。
OnBackPressedCallback
の有効な状態を変更することをおすすめします。
一時的な変更に対して使用しないでください。そうすることで、上記の順序が維持されます。
これは、コールバックを複数のイベントに登録している場合に特に重要です。
ライフサイクル所有者を指定できます
OnBackPressedCallback
を完全に削除する場合は、次のようにします。
呼び出して
remove()
。
コールバックは自動的に削除されるため、通常はこの操作を行う必要はありません。
関連付けられているLifecycleOwner
:
破棄されます。
onBackPressed() アクティビティ
以下を使用している場合:
onBackPressed()
[戻る] ボタンイベントを処理するには、
代わりに OnBackPressedCallback
してください。
ただし、この変更ができない場合は、次のルールが適用されます。
addCallback
を通じて登録するコールバックはすべて、super.onBackPressed()
を呼び出したときに評価されます。- Android 12(API レベル 32)以前では、登録された
OnBackPressedCallback
インスタンスに関係なく、常にonBackPressed
が呼び出されます。