[Android] [Jetpack]ナビゲーションの基本的な使い方

ナビゲーションはナビゲーションに変換されます。

ナビゲーションとは、ユーザーがアプリケーションをナビゲート、入力、および終了することをサポートするさまざまなコンテンツフラグメントの相互作用を指します。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リソースファイル

nav-graph.png

ポップアップインターフェイスでは、ファイル名を自由に入力できます。リソースの種類は[ナビゲーション]で、[OK]をクリックします。

nav-graph2.png

[OK]をクリックすると、ナビゲーションディレクトリがresディレクトリに作成され、定義したナビゲーションファイルも作成されます。

nav-graph3.png

ダブルクリックして、作成したナビゲーションファイルを開きます。デザインインターフェイスにコンテンツがないことがわかります。上の+アイコンをクリックしてフラグメントを追加するか、手動でxmlに追加できます。

nav-graph4.png

開始インターフェースであるこのファイルのstartDestinationを指定する必要があります

nav-graph5.png

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.NavHostFragmentnavGraph構成された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()

 

おすすめ

転載: blog.csdn.net/xfb1989/article/details/110876273