關于Navigation簡單集成使用(java)

一 集成

  1. 在項目的build.gradle中添加依賴
    def nav_version='2.0.0'
    implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
    implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
  1. 創(chuàng)建navigation資源文件夾

右鍵res文件夾 → new → Android Ressource (Directory / File) → typ類型選擇navigation

  1. 創(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" />
  1. 正常使用時name屬性用來指定要加載的碎片的路徑而使用Navigation這個要固定寫法androidx.navigation.fragment.NavHostFragment(重點)
  2. navGraph屬性就是指定要加載的操作 也就是上面創(chuàng)建的navigation文件
  3. 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)

  1. 跳轉(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");
  1. 類型安全方式傳遞參數(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();

附上源碼

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末琳拨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子写穴,更是在濱河造成了極大的恐慌沮榜,老刑警劉巖览绿,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萍丐,死亡現(xiàn)場離奇詭異相叁,居然都是意外死亡柄冲,警方通過查閱死者的電腦和手機吻谋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來现横,“玉大人漓拾,你說我怎么就攤上這事阁最。” “怎么了骇两?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵速种,是天一觀的道長。 經(jīng)常有香客問我低千,道長配阵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任示血,我火速辦了婚禮棋傍,結果婚禮上,老公的妹妹穿的比我還像新娘难审。我一直安慰自己瘫拣,他們只是感情好,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布告喊。 她就那樣靜靜地躺著麸拄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪黔姜。 梳的紋絲不亂的頭發(fā)上拢切,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音地淀,去河邊找鬼失球。 笑死,一個胖子當著我的面吹牛帮毁,可吹牛的內(nèi)容都是我干的实苞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼烈疚,長吁一口氣:“原來是場噩夢啊……” “哼黔牵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起爷肝,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤猾浦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后灯抛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體金赦,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年对嚼,在試婚紗的時候發(fā)現(xiàn)自己被綠了夹抗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轮纫。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡戳吝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情似扔,我是刑警寧澤牙言,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布艘儒,位于F島的核電站袜漩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏度液。R本人自食惡果不足惜厕宗,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望恨诱。 院中可真熱鬧媳瞪,春花似錦、人聲如沸照宝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厕鹃。三九已至兢仰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間剂碴,已是汗流浹背把将。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留忆矛,地道東北人察蹲。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像催训,于是被迫代替她去往敵國和親洽议。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容