2022

AndroidJetPack组件 - Navigation使用

2018-09-25  本文已影响0人  TastyDeath

Navigation

Navigation是google官方新增的用于Fragment管理的一个架构组件,可以很方便的像管理Activity一样管理你的Fragment,并且google在AndroidStudio3.2中加入了可视化手动拖拽式的组件

基本概念

Navigation的编写原则

Navigation简单例子的编写步骤

1.有一个Activity,在layout文件中声明一个fragment

  <?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.apm29.yjw.demo.ui.main.MainActivity">
    <fragment
        android:layout_width="match_parent"
        android:id="@+id/my_nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:navGraph="@navigation/main_nav_graph"
        app:defaultNavHost="true"
        android:layout_height="match_parent"/>
</FrameLayout>

当然Navigation也提供了代码式的引入形式

val finalHost = NavHostFragment.create(R.navigation.main_nav_graph)
supportFragmentManager.beginTransaction()
    .replace(R.id.nav_host, finalHost)
    .setPrimaryNavigationFragment(finalHost) // this is the equivalent to app:defaultNavHost="true"
    .commit()

2.编写main_nav_graph.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"
    app:startDestination="@id/mainFragment">

    <fragment
        android:id="@+id/mainFragment"
        android:name="com.apm29.yjw.demo.ui.main.MainFragment"
        android:label="MainFragment">
        <action
            android:id="@+id/action_mainFragment_to_mainDetailFragment"
            app:destination="@id/mainDetailFragment" />
    </fragment>
    <fragment
        android:id="@+id/mainDetailFragment"
        android:name="com.apm29.yjw.demo.ui.main.MainDetailFragment"
        android:label="MainDetailFragment">
        <argument android:name="id"
            app:argType="String"
            android:defaultValue="0"/>
        <deepLink
            android:autoVerify="true"
            app:uri="www.main.detail/{id}" />
    </fragment>
</navigation>
  1. 将Navigation绑定到UI组件

其中有一个关键的类NavController,通过以下方法得到其实例

  • NavHostFragment.findNavController(Fragment)
  • Navigation.findNavController(Activity, @IdRes int viewId)
  • Navigation.findNavController(View)

然后使用它的navigate方法导航到你想去的Destination,接收参数可以是一个ActionId(定义在nav_graph文件中的),使用navigateUp,popBackStack对应Up和Back按键,另外还可以加入Bundle,NavOption,ShareElements等,参考https://developer.android.google.cn/topic/libraries/architecture/navigation/navigation-implementing#Create-transition

// Rename the Pair class from the Android framework to avoid a name clash
import android.util.Pair as UtilPair
...
val options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity,
        UtilPair.create(imageView, "header_image"),
        UtilPair.create(titleView, "header_title"))
val extras = ActivityNavigator.Extras(options)
view.findNavController().navigate(R.id.details,
    null, // Bundle of args
    null, // NavOptions
    extras)

使用SharedElement

val extras = FragmentNavigatorExtras(
    imageView to "header_image",
    titleView to "header_title")
view.findNavController().navigate(R.id.confirmationAction,
    null, // Bundle of args
    null, // NavOptions
    extras)

先给navigate()方法添加extra参数,包含了一些<View,String>的Pair,View表示sharedElement,String则是transitionName,可以在xml中确定也可以代码确定

<ImageView
        android:transitionName="@string/app_icon"
        android:id="@+id/imageView"
        app:srcCompat="@mipmap/ic_launcher_round" />
imageView.transitionName = getString(R.string.app_icon)

然后再设置Fragment中的SharedElementReturnTransition和SharedElementEnterTransition

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            sharedElementReturnTransition = AutoTransition()
            sharedElementEnterTransition = AutoTransition()
 }

实际上Navigation 1.0.0 alpha06才加入的这个功能,并不是很完善,只为我们完成了SharedELement的添加,剩余工作还是我们自己完成

上一篇 下一篇

猜你喜欢

热点阅读