「戻る」ナビゲーションとは、ユーザーがこれまでにアクセスした画面の履歴を遡って移動する機能です。すべての 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が呼び出されます。