最近簡單看了下google推出的框架Jetpack,感受此框架的內容能夠對平時的開發有很大的幫助,也能夠解決不少開發中的問題,對代碼的邏輯和UI界面實現深層解耦,打造數據驅動型UI界面。android
Android Architecture組件是Android Jetpack的一部分,它們是一組庫,旨在幫助開發者設計健壯、可測試和可維護的應用程序,包含一下組件:git
上述時Android Architecture所提供的架構組件,本文一塊兒來看一下Navigation組件的使用。github
導航架構組件簡化了Android應用程序中導航的實現,經過在xml中添加元素並指定導航的起始和目的地,從而在Fragment之間創建鏈接在Activity中調用xml中設置的導航action從而跳轉界面到目的地,簡單來講它和以前在活動中調用startActivity的區別就相似於代碼佈局和xml中layout佈局同樣,既簡單又可視化,以下圖就是一個navigaton的xml圖:編程
Navigation多數做用於Fragment中,不過導航組件還支持:Fragment、Activity、導航圖和子圖、自定義目標bash
3.一、在項目中設置Navigation架構
dependencies {
def nav_version = "1.0.0-alpha06"
implementation "android.arch.navigation:navigation-fragment:$nav_version"
implementation "android.arch.navigation:navigation-ui:$nav_version"
androidTestImplementation "android.arch.navigation:navigation-testing:$nav_version"
}複製代碼
3.二、Navigation編輯器app
3.三、肯定目的地框架
上面的屬性選中後都會自動生成xml中的代碼,如:編輯器
<fragment android:id="@+id/blankFragment"
android:name="com.example.administrator.navigation.BlankFragment"
android:label="fragment_blank"
tools:layout="@layout/fragment_blank">
</fragment>複製代碼
3.四、鏈接目的地ide
<action
android:id="@+id/action_otherFragment_to_blankFragment" // 在導航時調用此ID設置目的
app:destination="@id/blankFragment" />複製代碼
4.一、修改活動導航
//在Activity的xml中添加fragment
<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
app:navGraph="@navigation/nav_graph"
app:defaultNavHost="true"
/>
// 在Activity中設置Navcontroller
override fun onSupportNavigateUp()
= findNavController(nav_host_fragment).navigateUp()複製代碼
val finalHost = NavHostFragment.create(R.navigation.example_graph)
supportFragmentManager.beginTransaction()
.replace(R.id.nav_host_fragment, finalHost)
.setPrimaryNavigationFragment(finalHost)
.commit()複製代碼
4.二、將目標綁定到UI小部件
使用NavController該類導航到目的地,系統提供如下獲取NavController的方法:
檢索 NavController,使用其 navigate() 方法傳入navigation.xml中設置的導航action,執行導航到目標
btnFragment.setOnClickListener {
Navigation.findNavController(btnFragment).navigate(R.id.action_blankFragment_to_secondFragment)
}複製代碼
除了上面的navigation()方法外,還能夠調用NavController.navigateUp() 和 NavController.popBackStack() 方法「向上」或「返回」,或使用 Navigation類的 createNavigateOnClickListener() 便捷方法導航到目標
button.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.next_fragment, null))複製代碼
執行上面的導航,點擊按鈕跳轉到第二個Fragment
// 導航抽屜菜單xml文件
<item android:id="@id/secondFragment"
android:title="Second"
android:icon="@drawable/ic_launcher_foreground"
android:menuCategory="secondary"
app:showAsAction="always"
/>複製代碼
val navigationView = findViewById<NavigationView>(R.id.nav_view)
NavigationUI.setupWithNavController(navigationView, findNavController(mainBlankFragment))複製代碼
運行結果:
// Set up ActionBar
setSupportActionBar(binding.toolbar)
NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)複製代碼
5.一、在目的地之間傳遞數據
此時的xml中添加了參數
<argument
android:name="value"
app:type="integer"
android:defaultValue="0" /複製代碼
代碼中,使用navigate() 方法建立一個Bundle並將其傳遞到目標
val bundle = Bundle()
bundle.putString("name","Blank")
bundle.putInt("number",10)
Navigation.findNavController(btnFragment).navigate(R.id.action_blankFragment_to_secondFragment,bundle)
// 在接收的代碼中,使用該 getArguments()方法檢索包並使用其內容
val tv = view.findViewById(R.id.textViewAmount)
text.text = "Name = ${arguments?.getString("name")} Number = ${arguments?.getInt("number")}"複製代碼
5.二、將目標分組爲嵌套導航圖
<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/navigation"
app:startDestination="@id/blankFragment">
<fragment ....../>
<navigation android:id="@+id/navigation2" app:startDestination="@id/blankFragment">
<fragment android:id="@+id/blankFragment" android:name="com.example.administrator.navigation.BlankFragment"
......
</fragment>
</navigation>
</navigation>複製代碼
此時預覽圖發生如下變化:
下面咱們將上面的兩個navigation並使用include引用,拆分以下:
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
......>
<fragment android:id="@+id/blankFragment" android:name="com.example.administrator.navigation.BlankFragment"
android:label="fragment_blank" tools:layout="@layout/fragment_blank">
......
<action android:id="@+id/action_blankFragment_to_include" app:destination="@id/secondActivity"/> // 跳轉到SecondActivity
//<action android:id="@+id/action_blankFragment_to_include" app:destination="@id/include"/> // 跳轉到include
**:注意這裏不管設置哪一個,只要是跳轉到include中,就會首先到app:startDestination的界面中
</fragment>
<include app:graph="@navigation/include"/>
</navigation>複製代碼
<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/include" app:startDestination="@id/secondActivity"> // 將include的startDestination設置爲SecondActivity因此直接跳到SecondActivity // 必須設置不然會報異常 no start destination defined via app:startDestination
<activity android:id="@+id/secondActivity" android:name="com.example.administrator.navigation.SecondActivity"
android:label="activity_second" tools:layout="@layout/activity_second"/>
</navigation>複製代碼
5.三、目標建立深層連接
<deepLink app:uri="https://cashdog.com/sendmoney"/>複製代碼
<activity name=".MainActivity">
<nav-graph android:value="@navigation/main_nav" />
</activity>複製代碼
5.四、目的地之間建立過渡
此時xml中會自動補充代碼:
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"複製代碼
5.五、條件導航
此時代碼自動填充:
// 在最外層自動添加
<action android:id="@+id/action_global_secondFragment2" app:destination="@id/secondFragment"/>複製代碼
使用共同目標
viewTransactionsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Navigation.findNavController(view).navigate(R.id.action_global_mainFragment);
}
});複製代碼
六、實戰
使用Navigation,在Activity實現各自Fragment的導航以及兩個Activity間的導航
<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/second" app:startDestination="@id/fragmentT">
<fragment android:id="@+id/fragmentT" android:name="com.example.administrator.navigation.FragmentT"
android:label="fragment_fragment_t" tools:layout="@layout/fragment_fragment_t">
<action android:id="@+id/action_fragmentT_to_fragmentOther" app:destination="@id/fragmentOther"/>
</fragment>
<fragment android:id="@+id/fragmentOther" android:name="com.example.administrator.navigation.FragmentOther"
android:label="fragment_fragment_other" tools:layout="@layout/fragment_fragment_other"/>
</navigation>複製代碼
<action android:id="@+id/action_blankFragment_to_secondActivity2" app:destination="@id/second"/>
// 跳轉到second導航複製代碼
btnActivity.setOnClickListener {
val option = ActivityOptionsCompat.makeSceneTransitionAnimation(activity as Activity, imageView, "image")
val exeras = ActivityNavigator.Extras(option)
Navigation.findNavController(btnFragment)
.navigate(R.id.action_blankFragment_to_secondActivity2, null, null, exeras)複製代碼
到此Navigation的使用介紹就結束了,Navigation的使用確實使應用導航的設計變得更加簡單,還有個更大的好處就是閱讀性極好,在以往咱們查看項目時,要想獲得導航須要在代碼中就行查看,如今直接能夠查看xml文件便可,是否是很方便,好了Android Jetpack組件快要介紹完了,敬請期待