目次
3.ナビゲーションマップを編集し、目的地をナビゲーションマップに追加します
1.はじめに
ナビゲーションはJetpackコンポーネントライブラリの一部であり、2018年にリリースされました。これは主にフラグメント管理に使用され、フラグメント間をジャンプして、単一のアクティビティアーキテクチャを簡素化します。
2.使用条件
1.AndroidStudioバージョンには3.2以降が必要です
2.モジュールの下のbuild.gradleに依存関係を追加し、オプションでプロジェクトの言語に従って依存関係を追加します。
dependencies {
def nav_version = "2.3.0"
// Java language implementation
implementation "androidx.navigation:navigation-fragment:$nav_version"
implementation "androidx.navigation:navigation-ui:$nav_version"
// Kotlin
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
}
依存関係の構成の問題については、公式Webサイト情報を確認できます:https://developer.android.com/jetpack/androidx/releases/navigation
公式ウェブサイトドキュメントアドレス:https://developer.android.com/guide/navigation
この記事で使用されているAndroidStudioのバージョン番号は4.0.1です。
3、主要なコンポーネント
- ナビゲーショングラフ:ナビゲーショングラフはxmlリソースであり、res / Navigation /の下に作成されます。
- NavHostFragment:コンテナと同様に、ナビゲーショングラフをコンテナに追加します。
- NavController:フラグメント(Kotlin / Javaオブジェクト)間のジャンプを処理します。
第四に、主な機能
- ビジュアルナビゲーションマップ
- 目的地とアクションでナビゲート
- トランジションアニメーション
- メニューナビゲーション、下部ナビゲーション、メニュードロワーナビゲーション
- タイプセーフなパラメータの受け渡し
- ディープリンク
宛先は、フラグメントまたはアクティビティ、あるいは別のナビゲーションマップとして理解できます。ターゲットと呼ばれることもあります。
5、使用
1.ナビゲーショングラフを作成します
プロジェクトnew—> Android Resource Fileを右クリックし、ファイル名を入力してここでカスタマイズします。navi_graphと呼ばれ、リソースタイプはナビゲーションを選択し、ディレクトリ名はナビゲーションを使用します。
注:ナビゲーションマップをプロジェクトに追加するときに、ナビゲーションの依存関係がアプリのbuild.gradleファイルに追加されていない場合、Android Studioはプロンプトを表示し、依存関係を追加します。
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/navi_graph">
</navigation>
- <navigation>は、各ナビゲーショングラフのルートノードです。
- <navigation>には、<activity>または<fragment>で表される1つ以上の宛先が含まれます。
- app:startDestinationは、ユーザーが最初にアプリケーションを開いたときのデフォルトの開始先を指定する属性です。
2.ナビゲーションエディタ
ナビゲーションエディタでは、ナビゲーションマップを直感的に編集することも、XMLを直接編集することもできます。
主に関係なく:
- 「ターゲット」パネル:ナビゲーションホストと「グラフィックエディタ」に現在存在するすべてのターゲットを一覧表示します。
- グラフィックエディタ:ナビゲーションマップの視覚的表現が含まれています。「デザイン」ビューと「テキスト」ビューで基本的なXML表現を切り替えることができます。
- プロパティ:現在選択されているアイテムのプロパティをナビゲーションマップに表示します。
3.ナビゲーションマップを編集し、目的地をナビゲーションマップに追加します
ナビゲーショングラフnavi_graph.xml編集モードに入り、右上隅にある[分割]をクリックします。ナビゲーショングラフは、すべての宛先とアクションを含むXMLリソースファイルです。
最初の方法
クリックして新しい宛先を入力し、[新しい宛先の作成]を選択してこれを例として取り上げ、FirstFragmentという名前のフラグメントを作成します。
xmlリソースは次のとおりです
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/navi_graph"
app:startDestination="@id/firstFragment">
<fragment
android:id="@+id/firstFragment"
android:name="com.example.navigationdemo.FirstFragment"
android:label="fragment_first"
tools:layout="@layout/fragment_first" />
<fragment
android:id="@+id/secondFragment"
android:name="com.example.navigationdemo.SecondFragment"
android:label="fragment_second"
tools:layout="@layout/fragment_second" />
<fragment
android:id="@+id/thirdFragment"
android:name="com.example.navigationdemo.ThirdFragment"
android:label="fragment_third"
tools:layout="@layout/fragment_third" />
</navigation>
さらにいくつかのフラグメントを作成します。これは、ジャンプの後半で使用されます。
注:app:startDestination = "@ id / firstFragment"はMainActivityに似ています。フラグメントタグの属性は、ターゲットをクリックして選択し、[プロパティ]パネルで変更および設定する か、XMLを直接編集できます。
2番目の方法
以前に新しいフラグメントを作成したことがある場合は、クリックして新しい宛先を入力し、新しく作成されたフラグメントを見つけることができます。たとえば、レイアウトがfragment_testであるTestFragmentがすでにあります。これがレイアウトファイル名です。
4.接続先
前述のように、ナビゲーショングラフには、宛先間の論理接続であるActionタグも含まれています。これは、ナビゲーションタグの下またはフラグメントタグの下にあります。actionタグとdestination属性は、宛先とジャンプ先を示します。他のコントロールのIDと同じ意味を持つid属性もあります。比較して理解することをお勧めします。XMLでは、アクションタグと属性の宛先を介して、IDはターゲットの接続を実現できます。
または、ナビゲーションエディタを使用して2つの宛先を接続します。
「では デザイン」タブで、あなたがナビゲートするユーザーをしたいターゲットの右側にマウスを合わせます。ターゲットの右側の上に円が表示されます
円をクリックして、接続する別の宛先にマウスをドラッグします。2つの宛先の間の結果行は、アクションを表します。
[テキスト]タブをクリックして、XMLビューに切り替えます。次に、IDがfirstFragmentのソースターゲットにアクションを追加します。アクションにはIDと宛先属性があります。次の例に示すように、宛先属性の値には次の宛先のIDが含まれます。
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph"
app:startDestination="@id/firstFragment">
<fragment
android:id="@+id/firstFragment"
android:name="com.ang.navigationtest.FirstFragment"
android:label="fragment_first"
tools:layout="@layout/fragment_first" >
<action
android:id="@+id/action_firstFragment_to_secendFragment"
app:destination="@id/secendFragment" />
</fragment>
<fragment
android:id="@+id/secendFragment"
android:name="com.ang.navigationtest.SecendFragment"
android:label="fragment_secend"
tools:layout="@layout/fragment_secend" />
<fragment
android:id="@+id/thirdFragment"
android:name="com.ang.navigationtest.ThirdFragment"
android:label="fragment_third"
tools:layout="@layout/fragment_third" />
</navigation>
実際に目的地に移動するには、ナビゲーションを実行するためのコードを作成する必要があることに注意してください。これは後で特定の説明にジャンプします。
5.NavHostFragmentをアクティビティに追加します
2つの方法もあります。
最初の方法
メインアクティビティのactivity_main.xmlレイアウトに書き込みます。具体的なコードは次のとおりです。名前は固定されており、変更できません。navGraph属性値は次のとおりです。
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<fragment
android:id="@+id/nav_host_fragments"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="androidx.navigation.fragment.NavHostFragment"
app:defaultNavHost="true"
app:navGraph="@navigation/navi_graph"/>
</androidx.constraintlayout.widget.ConstraintLayout>
app:defaultNavHost = "true":ナビゲーションコンテナにリターンイベントを処理させます。ナビゲーションコンテナにページジャンプがある場合、リターンボタンをクリックすると、最初にコンテナ内のフラグメントページ間のリターンが処理され、次にコンテナ内のページを処理した後にアクティビティが処理されます。ページの戻り。値がfalseの場合、アクティビティページの戻り値は直接処理されます。ここでは、ナビゲーショングラフの人気が爆発的に高まっていることがわかりますが、現在は消えています。
2番目の方法:
アクティビティレイアウトで制約レイアウトを使用している場合は、レイアウトビューの[分割]で、NavHostFragmentをコンテナにドラッグアンドドロップしてから、独自のナビゲーションマップファイルを選択します。制約を設定することを忘れないでください。
6、ジャンプ
目的地間のジャンプを実現するには、NavControllerを使用します
NavControllerを取得する主な方法は3つあります
NavHostFragment.findNavController(Fragment)
Navigation.findNavController(Activity、@ IdRes int viewId)
Navigation.findNavController(View
これも可能のようです
FragmentManager supportFragmentManager = getActivity()。getSupportFragmentManager();
NavHostFragment navHostFragment =(NavHostFragment)supportFragmentManager.findFragmentById(R.id.fragment);
NavController navController = navHostFragment.getNavController();
次に、NavControllerのnavigateメソッドをジャンプします。ここでresIdは、ナビゲーショングラフの宛先フラグメントのID、またはソースと宛先のアクションのIDにすることができます。
//navigate方法
public void navigate(@IdRes int resId) {
navigate(resId, null);
}
ジャンプは次の方法でも実現できます
view.findViewById(R.id.btn_to_secend).setOnClickListener( Navigation.createNavigateOnClickListener(R.id.secendFragment, null));
7、グローバルアクション
前述のように、ナビゲーションタグの下にアクションを追加することもできます。これはグローバルアクションであり、複数の送信元の宛先を解決して同じ宛先にジャンプできます。各送信元の宛先に同じアクションを記述する必要はありません。正確です。それは宛先属性であるべきだと言った。
8.データ転送
NavControllerのナビゲートジャンプメソッドには、Bundleパラメータを持つオーバーロードメソッドもあるため、宛先間のデータ転送はBundleを介して実現できます。
public void navigate(@IdRes int resId, @Nullable Bundle args) {
navigate(resId, args, null);
}
9、戻る
NavControllerがジャンプを実現できるようになったので、同様の関数ロールバックをもちろん実現できます。NavControllerには、前のレベルに戻るための2つのメソッドnavigateUp()とpopBackStack()があります。
10.動的ロード
ナビゲーションは、フラグメントまたはアクティビティに動的にロードできます。
FragmentManager supportFragmentManager = getSupportFragmentManager();
NavHostFragment navHostFragment = (NavHostFragment) supportFragmentManager.findFragmentById(R.id.fragment);
NavController navController = navHostFragment.getNavController();
navController.setGraph(R.navigation.nav_graph);
NavHostFragment也是一个Fragment;可以当作一个Fragment使用;