【问题标题】:Pass safe-args when navigate to fragment导航到片段时传递安全参数
【发布时间】:2018-10-03 08:18:49
【问题描述】:

在使用navigation 时,通过动作(使用directions 类)很容易传递safe-args。 但是在直接使用导航分片的情况下如何传递safe-args呢?

navController?.navigate(R.id.detailFragment)

nav_graph:

<fragment
    android:id="@+id/detailFragment"
    android:name="com.example.ui.main.detail.DetailFragment"
    android:label=" "
    tools:layout="@layout/detail_fragment" >
    <argument
        android:name="templateCode"
        app:argType="string" />
    <action
        android:id="@+id/action_start_guide"
        app:destination="@id/fillInfoFragment" />
</fragment>

【问题讨论】:

    标签: android navigation android-jetpack android-architecture-navigation


    【解决方案1】:

    使用类型安全的方式是个好主意,因为它为您带来编译时安全和一些便利。

    这个库将构建参数的类MyDestinationArgs。您可以使用它来构建Bundle 并将结果通过这种方式传递到目的地:

    val args = DetailFragmentArgs.Builder("template_code").build().toBundle()
    navController?.navigate(R.id.confirmationAction, args) 
    

    在接收方,您也可以使用参数类检索数据:

    val templateCode = SecondFragmentArgs.fromBundle(arguments).templateCode
    

    如果由于某些原因我们不能使用 safeargs 库,

    我们也可以在Bundle 中传递数据。假设你已经添加了

    const val ARG_TEMPLATE_CODE = "templateCode"
    

    DetailFragmentcompanion object 中的常量(Java 中的 static final 字段)

    现在你可以这样传递数据了:

    val args = Bundle()
    args.putString(DetailFragment.ARG_TEMPLATE_CODE, "some_code")
    navController?.navigate(R.id.confirmationAction, args)
    

    并且接收者片段可以从参数中获取数据:

    arguments?.getString(ARG_TEMPLATE_CODE)
    

    或者,如果目标目的地是Activity,您可以从intent extras 获取数据(ARG_TEMPLATE_CODE 常量现在来自目的地活动):

    intent?.extras?.getString(ARG_TEMPLATE_CODE)
      
    

    在文档 herehere 中了解更多信息。

    【讨论】:

      【解决方案2】:

      安全的方法是在需要“直接”导航到片段时定义全局操作

      <fragment
          android:id="@+id/detailFragment"
          android:name="com.example.ui.main.detail.DetailFragment"
          android:label=" "
          tools:layout="@layout/detail_fragment" >
          <argument
              android:name="templateCode"
              app:argType="string" />
          <action
              android:id="@+id/action_start_guide"
              app:destination="@id/fillInfoFragment" />
      </fragment>
      
      <action
          android:id="@+id/action_detail_fragment"
          app:destination="@id/fillInfoFragment" />
      

      然后

      findNavController().navigate(NavGraphDirection.actionDetailFragment(templateCode))
      

      【讨论】:

      • 由于某种原因我无法找到 NavGraphDirection。当对片段使用特定操作时,可以,但是对于全局操作,我没有生成操作。你知道为什么吗?
      • @obey 尝试重建应用程序
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 2019-10-06
      • 2018-12-08
      • 1970-01-01
      相关资源
      最近更新 更多