一 集成
- 在項目的build.gradle中添加依賴
def nav_version='2.0.0'
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
- 創(chuàng)建navigation資源文件夾
右鍵res文件夾 → new → Android Ressource (Directory / File) → typ類型選擇navigation
-
創(chuàng)建navigation 文件(劃重點)
新創(chuàng)建好的文件是空白的如圖
image.png
再如圖
image.png
選擇好界面之后可以用拖拽的方式指定跳轉(zhuǎn)的路線
image.png
選擇左下角切換到text模式就可以看到自動的已經(jīng)填充好了代碼
image.png
需要補充一下
跟節(jié)點上的startDestination 屬性是要自己設置的 用來指定第一個顯示的fragment(字面意思)
如果用代碼的方式關聯(lián)activity與fragment 會用到跟節(jié)點上的id(下面會說)
argument 節(jié)點是跳轉(zhuǎn)的時候需要用到的(下面會說)
action節(jié)點下的id會經(jīng)常用到 用于找到需要執(zhí)行動作(好像描述的有點繞...)
二 關聯(lián)activity
配置好了跳轉(zhuǎn)相關的參數(shù)下面來把這些動作與activity相關聯(lián)起來
1.布局中使用fragment關聯(lián)
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/nav_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
app:navGraph="@navigation/navigation_file"
app:defaultNavHost="true" />
- 正常使用時name屬性用來指定要加載的碎片的路徑而使用Navigation這個要
固定寫法androidx.navigation.fragment.NavHostFragment
(重點) - navGraph屬性就是指定要加載的操作
也就是上面創(chuàng)建的navigation文件
- defaultNavHost 這個屬性有意思了
設置為true的時候點擊系統(tǒng)返回鍵返回到上個界面 設置為false時則直接退出應用
2.代碼中關聯(lián)(注意xml中已經(jīng)換成了Framelayout控件喲)
xml布局
<FrameLayout
android:id="@+id/my_framelayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
代碼關聯(lián)
NavHostFragment navHost = NavHostFragment.create(R.navigation.navigation_file);
getSupportFragmentManager().beginTransaction()
.replace(R.id.my_framelayout, navHost)
.setPrimaryNavigationFragment(navHost) // this is the equivalent to app:defaultNavHost="true"
.commit();
二 navigation的使用
1. 普通跳轉(zhuǎn)(反手一個 ctrl v)
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Navigation.findNavController(getView()).navigate(R.id.actionId);
}
});
代碼言簡意賅 需要說一下的就是獲取的這個
navigate()
這個參數(shù)需要填寫一個id這個id就是上面提到的navigation文件下action標簽下面的id
還有就是不要寫成其他fragment的id
2. 返回上一頁(直接上代碼)
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Navigation.findNavController(getView()).popBackStack();
}
});
3. 帶參數(shù)跳轉(zhuǎn)
- 跳轉(zhuǎn)的時候可以添加bundle
//跳轉(zhuǎn)代碼
Bundle bundle = new Bundle();
bundle.putString("key","我是傳遞的數(shù)據(jù)");
Navigation.findNavController(getView()).navigate(R.id.action_fragmentOne_to_fragmentTwo,bundle);
//------------------------------------------華麗的分割線----------------------------------------------
//接收代碼
Bundle arguments = getArguments();
String data = arguments.getString("key");
- 類型安全方式傳遞參數(shù)(稍有麻煩)
項目build.gradle中添加
dependencies {
classpath 'android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0-alpha02' //navigation安全方式傳遞數(shù)據(jù)
...
}
modle的build.gradle中添加
apply plugin: 'androidx.navigation.safeargs' //navigation安全數(shù)據(jù)傳遞
同步完成后進入到navigation文件中會發(fā)現(xiàn)新增加了argument標簽這就是我們想要的東西(上面有提到)
image.png
記得添加之后要重新build生成文件然后就可以使用了
//build之后會生成同fragment名稱+Args的一個文件 (我的Fragment名字就是 FragmentTwo)
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FragmentTwoArgs data = new FragmentTwoArgs.Builder("這是第二種方式傳遞的數(shù)據(jù)").build();
Navigation.findNavController(getView()).navigate(R.id.action_fragmentTwo_to_fragmentThree,data.toBundle());
}
});
//------------------------------------------又見華麗的分割線----------------------------------------------
//接收代碼
String stringData = FragmentTwoArgs.fromBundle(getArguments()).getStringData();