ナビゲーションとは
ナビゲーションはナビゲーションに変換されます。
ナビゲーションとは、ユーザーがアプリケーションをナビゲート、入力、および終了することをサポートするさまざまなコンテンツフラグメントの相互作用を指します。Android Jetpackのナビゲーションコンポーネントは、ボタンをクリックするだけでも、アプリケーションバーやナビゲーションドロワーなどのより複雑なパターンでも、ナビゲーションを実現するのに役立ちます。コンポーネントはそれを処理できます。ナビゲーションコンポーネントは、確立された一連の原則に従うことにより、一貫性のある予測可能なユーザーエクスペリエンスも保証します。
ナビゲーションコンポーネントは、次の3つの主要部分で構成されています。
-
ナビゲーションマップ:一元化された場所にすべてのナビゲーション関連情報を含むXMLリソース。これには、アプリ内のすべての個別のコンテンツ領域(ターゲットと呼ばれる)と、ユーザーがアプリを介してアクセスできる可能なパスが含まれます。
-
NavHost:ナビゲーションマップにターゲットを表示する空白のコンテナー。ナビゲーションコンポーネントには、フラグメントターゲットを表示できるデフォルトのNavHost実装(NavHostFragment)が含まれています。
-
NavController:NavHostでアプリケーションナビゲーションのオブジェクトを管理します。ユーザーがアプリケーション全体を移動すると、NavControllerはNavHostでターゲットコンテンツの交換を手配します。
アプリ内を移動するときは、ナビゲーションマップの特定のパスに沿って特定のターゲットに移動するか、特定のターゲットに直接移動するかをNavControllerに指示します。NavControllerは、対応するターゲットをNavHostに表示します。
ナビゲーションコンポーネントには、次のような他のさまざまな利点があります。
-
フラグメントトランザクションを処理します。
-
デフォルトでは、ラウンドトリップ操作は正しく処理されます。
-
アニメーションとトランジションのための標準化されたリソースを提供します。
-
ディープリンクを実装して処理します。
-
ナビゲーションインターフェイスモード(ナビゲーションドロワーや下部ナビゲーションなど)を含め、ユーザーはごくわずかな追加作業を完了するだけで済みます。
-
SafeArgs-ターゲット間を移動してデータを渡すときに型の安全性を提供するGradleプラグイン。
-
ViewModelのサポート-ViewModelのスコープをナビゲーショングラフに制限して、グラフのターゲット間でインターフェイス関連のデータを共有できます。
-
さらに、Android Studioのナビゲーションエディターを使用して、ナビゲーションマップを表示および編集することもできます。
以上内容来自官方文档(我只是一个搬运工\(^o^)/)
使いやすい
ナビゲーションを紹介する
ナビゲーションを使用する必要があるモジュールのbuild.gradleで導入されました
def nav_version = "2.3.0-alpha01"
implementation "androidx.navigation:navigation-fragment:$nav_version"
implementation "androidx.navigation:navigation-ui:$nav_version"
ナビゲーションマップを作成する
resディレクトリを右クリック-新規-Androidリソースファイル
ポップアップインターフェイスでは、ファイル名を自由に入力できます。リソースの種類は[ナビゲーション]で、[OK]をクリックします。
[OK]をクリックすると、ナビゲーションディレクトリがresディレクトリに作成され、定義したナビゲーションファイルも作成されます。
ダブルクリックして、作成したナビゲーションファイルを開きます。デザインインターフェイスにコンテンツがないことがわかります。上の+アイコンをクリックしてフラグメントを追加するか、手動でxmlに追加できます。
開始インターフェースであるこのファイルのstartDestinationを指定する必要があります
startDestinationはmainFragmentとして指定され、mainFragmentの対応するレイアウトはfragment_mainです。
ナビゲーションは最初にデフォルトのフラグメントをロードします。これはアクティビティで指定する必要があります
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_graph" />
</LinearLayout>
defaultNavHostをtrueに構成します。つまり、このフラグメントをデフォルトのNavHostとして指定し、各ナビゲーションマップは1つのデフォルトのNavHostのみを指定できます。ここでname
構成されandroidx.navigation.fragment.NavHostFragment
、navGraph
構成されたnav_graph、つまりnav_graphマップとして指定されます。このように、アクティビティが開始すると、最初に、ナビゲーション図のstartDestinationで構成されたフラグメントが、アクティビティレイアウトのフラグメントを介してロードされます。
ナビゲーション
あるフラグメントから別のフラグメントに移動すると、パスできます
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main, container, false);
loginBtn = view.findViewById(R.id.fragment_main_login);
loginBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Bundle bundle = new Bundle();
bundle.putString("name", "zs");
Navigation.findNavController(v).navigate(R.id.action_mainFragment_to_loginFragment, bundle);
}
});
return view;
}
ここで、ボタンをクリックして、Navigation.findNavController(v).navigate()
メソッドをジャンプしてナビゲートします。ここでは、バンドルを介して値を渡すこともできます。
宛先フラグメントでは、getArguments()
渡されたデータは次の方法で取得できます。
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
String name = getArguments().getString("name", "null");
Toast.makeText(getContext(), name, Toast.LENGTH_SHORT).show();
View view = inflater.inflate(R.layout.fragment_login, container, false);
backBtn = view.findViewById(R.id.fragment_login_back);
backBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Navigation.findNavController(v).popBackStack();
}
});
return view;
}
宛先フラグメントでは、ボタンを使用して前のフラグメントに戻ることもできます。Navigation.findNavController(v).popBackStack()