ナビゲーション

ユーザー ジャーニーごとに個別の画面を設計した後は、縦方向の画面や 1 つの画面だけにすることもできます。次に、これらの画面が連携するように設計する方法と、ナビゲーションの実装方法を決定します。

デザイン

アプリの設計ガイドラインで規定されているように、アプリの階層は浅く線形にします。

まず、アプリのランチャーで最も一般的なユーザー ジャーニーを開く必要があります。最も重要なコンテンツを一番上に配置して各ユーザー ジャーニーを設計します。垂直コンテナの場合は、下部を使用して、あまり一般的でない他のユーザー ジャーニーと設定にリンクします。

図 1. 最も重要なコンテンツは垂直コンテナの上部に配置する。

ユーザーがいずれかの画面に移動したときに、スワイプして閉じる操作でバックスタックに移動できることを確認します。

ナビゲーションを実装する

ナビゲーションを実装する場合は、次のセクションで説明する 3 つのオプションがあります。

  • アクティビティのみ(おすすめの方法)
  • アクティビティとフラグメント
  • Jetpack Navigation

アクティビティのみ

通常、垂直画面の深さは 1 レベルであるため、アクティビティを使用して、フラグメントを使用せずにすべての画面を実装できます。

この方法を強くおすすめします。コードが簡素化され、アクティビティでスワイプによる非表示が自動的にサポートされます。これにより、常に画面表示モードの実装も簡単になります。

注: フラグメントを使用しない場合は、アクティビティを ComponentActivity から継承するようにしてください。他のアクティビティ タイプでは、Wear OS に必要のないモバイル固有の UI 要素を使用します。

アクティビティとフラグメント

Wear OS アプリのアクティビティではフラグメントを使用できます。ただし、フラグメントを使用してシャローでフラットなアーキテクチャを作成することには明らかなメリットがないため、この方法はおすすめしません。

注: フラグメントを使用している場合は、FragmentActivity から継承するようにしてください。他のアクティビティ タイプでは、Wear OS に必要のないモバイル固有の UI 要素を使用します。

Wear OS アプリでフラグメントを使用する際の困難点は次のとおりです。

  • スワイプして閉じる操作を自分で実装する必要があります。それ以外の場合は、ユーザーがスワイプするとアプリ全体が終了します。
  • AmbientMode を使用している場合は、適切に動作するようにカスタマイズする必要があります。AmbientMode はアクティビティに対して設定されるため、フラグメントを実装する際はこの点を考慮する必要があります。

スワイプして閉じる操作をサポートするには、フラグメントを含むビューを SwipeDismissFrameLayout クラスにラップする必要があります。詳しくは、スワイプして閉じる操作をご覧ください。これにより、アプリで一貫したユーザー エクスペリエンスを実現できます。

注: フラグメントを使用する場合、スワイプして閉じる操作をサポートするため、FragmentManager.replace ではなく FragmentManager.add を使用してください。これにより、前のフラグメントが、スワイプして消されるときに、上部フラグメントの下にレンダリングされるようになります。

Jetpack Navigation

Jetpack Navigation は Wear OS で動作しますが、フラグメントと同じ欠点があります。開発作業が増えますが、Wear OS アプリの階層は一般的に浅く線形であるため、多くのメリットはありません。アクティビティのみのアプローチが最適です。

Jetpack Navigation を最大限に活用するには、以下の操作を行います。

  • すべてのフラグメントが SwipeDismissFrameLayout をルートとして使用し、閉じるアクションを手動で使用してナビゲーション グラフに戻るようにします。
  • フラグメントを重ねてレンダリングするカスタムの FragmentNavigator を実装します。