🚀

Predictive back gesture対応のハマりどころ

に公開

自社のAndroidアプリでPredictive back対応する際に調査で半日ほど時間を無駄にしてしまったので、ハマりポイントを紹介します。
これからAndroid16対応(targetSdk = "36"対応)でPredictive back gestureの対応をされる方もいるかと思いますので参考になれば幸いです。

※ 今回対応したアプリは画面遷移にJetpack Navigation(navigation-fragment)を利用しており、下記で紹介する内容のほとんどがnavigation-fragmentに起因する内容です。

Predictive back gesture対応の基礎知識

Predictive back gestureは二段階の作業があります。

  • onBackPressedKeyEvent.KEYCODE_BACKイベントをフックした戻る動作を OnBackPressedCallback に置き換える対応
  • 戻る時の遷移アニメーションをつける対応

一つ目の対応は全てのアプリで共通ですが、戻る時の遷移アニメーションの実装はそれぞれ異なります。
また、OnBackPressedCallbackへの置き換えだけでは遷移アニメーションはつかないことに注意が必要です。

navigation-fragmentの場合は

https://github.com/android/platform-samples/tree/main/samples/user-interface/predictiveback#cross-fragment-animation
<action
    android:id="..."
    app:destination="..."
    app:enterAnim="@animator/nav_default_enter_anim"
    app:exitAnim="@animator/nav_default_exit_anim"
    app:popEnterAnim="@animator/nav_default_pop_enter_anim"
    app:popExitAnim="@animator/nav_default_pop_exit_anim" />

のような設定を各action毎に記述すると戻る操作時に遷移アニメーションが実行されます。以降の章ではこれらの設定をしたにも関わらず遷移アニメーションが反映されない場合に参考にしてください。

ライブラリバージョン

公式ドキュメントに言及がありますが、Predictive back gesture対応するためのライブラリバージョンの指定があります。

特にfragmentは推移的な依存として含まれている場合には2025年9月地点だと1.6系が入っていることがあるので、それぞれ明示的に依存に含めるのが良さそうです。

defaultNavHost

defaultNavHost=falseにしてしまうと戻る時のジェスチャーイベントが Navigationライブラリに伝わらないため、Predictive back gestureによる前画面と滑らかに切り替わるアニメーションを表示することはできません。
defaultNavHostは基本的にtrueにする他ないですが、既存実装がfalseになっていて変更していいか判断が難しい場合は下記のドキュメントなどに振る舞いの説明が載っているので参考になります。

https://developer.android.com/guide/navigation/use-graph/programmatic?hl=ja

https://yuki312.blogspot.com/2021/02/navhostfragmentfragmentsetprimarynaviga.html

OnBackPressedCallback

defaultNavHost=falseなアプリは、戻る時の振る舞いを自分で実装する必要があるため、大元のActivtyで広域なOnBackPressedCallbackを実装している可能性が高いです。このような実装もNavigationライブラリに戻るイベントが伝播しなくなるので修正が必要になります。OnBackPressedCallbackisEnabledにBooleanを渡して動的な制御が可能です。特殊な遷移処理をする時以外は無効にするとPredictive back gestureの遷移アニメーションが描画されるようになります。

関連リンク

https://developer.android.com/guide/navigation/custom-back/predictive-back-gesture
https://developer.android.com/guide/navigation/custom-back/support-animations
https://github.com/android/platform-samples/tree/main/samples/user-interface/predictiveback
https://qiita.com/Nabe1216/items/b24211407c93f079c238

Discussion