Navigation的使用

聲明:個人筆記,無參考學習價值
部分內(nèi)容摘抄自:
作者:七適散人
鏈接:http://www.reibang.com/p/d37f5132db3c

1.res-->Android Resource File-->navigation-->xxx.xml

2.xxx.xml中將需要的多個fragment進行管理,可以指定Actions,Argments

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/main_tab_navigation"
    xmlns:tools="http://schemas.android.com/tools"
   ?? app:startDestination="@id/homepageFragment">
    <fragment
        tools:layout="@layout/fragment_homepage"
<--如果配合bottomNavigationView和menu使用的話,這里的id要和menu的id相同-->
       ?? android:id="@+id/homepageFragment"
        android:name="com.myself.mvpdemo.maintap.view.fragment.HomepageFragment"
        android:label="HomepageFragment" >
        <action
            android:id="@+id/action_homepageFragment_to_qandAfragment"
            app:destination="@id/qandAfragment" />
        <argument
            android:name="safeData"
            app:argType="integer"
            android:defaultValue="12" />
    </fragment>
</navigation>

tools:layout="@layout/fragment_homepage" : fragment的layout
android:name="" fragment的路徑

3 在actiivty中的引用,定義一個fragment:

  • 第一種:在xml文件中定義
  <fragment
      android:id="@+id/nav_fragment"
     ?? android:name="androidx.navigation.fragment.NavHostFragment"
     ?? app:navGraph="@navigation/main_tab_navigation"
     ?? app:defaultNavHost="true"
      android:layout_width="match_parent"
      android:layout_weight="1"
      android:layout_height="0dp"/>

android:name 是 NavHostFragment,它實現(xiàn)了 NavHost,這是一個用于放置管理 destination 的空視圖杈绸。
app:navGraph 用于將這個 NavHostFragment 和 xxx.xml 關聯(lián)起來。
app:defaultNavHost 表示 NavHostFragment 可以攔截處理返回鍵翠肘。

  • 第二種 通過代碼創(chuàng)建 NavHostFragment空盼,先修改 Activity 的 xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
    ... >

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/frame_layout" />
</android.support.constraint.ConstraintLayout>

在activity中使用:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_navigation)
    
    val finalHost = NavHostFragment.create(R.navigation.nav_graph)
    supportFragmentManager.beginTransaction()
            .replace(R.id.frame_layout, finalHost)
            .setPrimaryNavigationFragment(finalHost) // 等價于 xml 中的 app:defaultNavHost="true"
            .commit()
}

4.處理跳轉

跳轉通過 NavController 對象,它有三種獲取方法:

  • NavHostFragment.findNavController(Fragment)
  • Navigation.findNavController(Activity, @IdRes int viewId)
  • Navigation.findNavController(View)
    調用 NavController 的 navigate 方法執(zhí)行跳轉阱持,navigate 的參數(shù)可以是一個 destination(這里就是 fragment 在導航圖 nav_graph 中的 id)琐馆,也可以是 action 的 id规阀。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    
    button.onClick {
    
//                NavHostFragment.findNavController(this@FirstFragment)
//                        .navigate(R.id.action_nav_graph_first_fragment_to_nav_graph_second_fragment)
        Navigation.findNavController(getView()!!)
                .navigate(R.id.action_nav_graph_first_fragment_to_nav_graph_second_fragment)
    }
}

5.添加跳轉動畫

可在可視化Design中操作,生成代碼:

<fragment
    android:id="@+id/nav_graph_first_fragment"
    android:name="pot.ner347.androiddemo.navigation.FirstFragment"
    android:label="first"
    tools:layout="@layout/fragment_first">
    <action
        android:id="@+id/action_nav_graph_first_fragment_to_nav_graph_second_fragment"
        app:destination="@id/nav_graph_second_fragment"
        app:enterAnim="@anim/nav_default_enter_anim"
        app:exitAnim="@anim/nav_default_exit_anim"
        app:popEnterAnim="@anim/nav_default_pop_enter_anim"
        app:popExitAnim="@anim/nav_default_pop_exit_anim" />
</fragment>

支持 View 動畫和屬性動畫,enterAnim 和 exitAnim 是去往棧里添加一個 destination 時兩個 destination 的動畫啡捶,popEnterAnim 和 popExitAnim 是從棧里移除一個 destination 時的動畫姥敛。

6.傳遞數(shù)據(jù)

要跳轉到 SecondFragment,要往 SecondFragment 里帶數(shù)據(jù)瞎暑,在目的 Fragment 里添加 <argument>

<!-- nav_graph.xml -->
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    ... >

    <fragment
        android:id="@+id/nav_graph_second_fragment"
        android:name="pot.ner347.androiddemo.navigation.SecondFragment"
        android:label="second"
        tools:layout="@layout/fragment_second" >
        <argument android:name="name" android:defaultValue="Max"/>
    </fragment>
</navigation>

FirstFragment 添加數(shù)據(jù)

button.onClick {
     val bundle = bundleOf("name" to "silas")
     Navigation.findNavController(getView()!!)
            .navigate(R.id.action_nav_graph_first_fragment_to_nav_graph_second_fragment, bundle)
}

SecondFragment 獲取數(shù)據(jù)

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {
    arguments?.getString("name")?.let { toast("hello $it") }
    return inflater.inflate(R.layout.fragment_second, container, false)
}

如果 FirstFragment 沒有帶數(shù)據(jù)彤敛,那么 SecondFragment 將收到默認值 “Max”。

7.類型安全方式傳遞數(shù)據(jù)

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末了赌,一起剝皮案震驚了整個濱河市慌盯,隨后出現(xiàn)的幾起案子御铃,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梳凛,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門郭卫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人背稼,你說我怎么就攤上這事贰军。” “怎么了蟹肘?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵词疼,是天一觀的道長。 經(jīng)常有香客問我帘腹,道長贰盗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任阳欲,我火速辦了婚禮舵盈,結果婚禮上,老公的妹妹穿的比我還像新娘胸完。我一直安慰自己书释,他們只是感情好,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布赊窥。 她就那樣靜靜地躺著,像睡著了一般狸页。 火紅的嫁衣襯著肌膚如雪锨能。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天芍耘,我揣著相機與錄音址遇,去河邊找鬼。 笑死斋竞,一個胖子當著我的面吹牛倔约,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坝初,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼浸剩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鳄袍?” 一聲冷哼從身側響起绢要,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拗小,沒想到半個月后重罪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年剿配,在試婚紗的時候發(fā)現(xiàn)自己被綠了搅幅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡呼胚,死狀恐怖茄唐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情砸讳,我是刑警寧澤琢融,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站簿寂,受9級特大地震影響漾抬,放射性物質發(fā)生泄漏。R本人自食惡果不足惜常遂,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一纳令、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧克胳,春花似錦平绩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至笆搓,卻和暖如春性湿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背满败。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工肤频, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人算墨。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓宵荒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親净嘀。 傳聞我的和親對象是個殘疾皇子报咳,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359