导航到片段时传递安全参数
Pass safe-args when navigate to fragment
使用navigation通过一个动作(使用方向class)时很容易通过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>
使用类型安全的方式是个好主意,因为它会给你带来编译时安全和一些便利。
此库将构建参数的 class MyDestinationArgs
。您可以使用它来构建 Bundle
并以这种方式将结果传递到目标:
val args = DetailFragmentArgs.Builder("template_code").build().toBundle()
navController?.navigate(R.id.confirmationAction, args)
在接收方,您也可以使用参数 class:
检索数据
val templateCode = SecondFragmentArgs.fromBundle(arguments).templateCode
如果由于某些原因我们不能使用 safeargs 库,
我们也可以在 Bundle
内部传递数据。假设你添加了
const val ARG_TEMPLATE_CODE = "templateCode"
DetailFragment
的 companion 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
现在来自目的地 activity 的常量):
intent?.extras?.getString(ARG_TEMPLATE_CODE)
安全的方法是在需要导航到片段的情况下定义全局操作"directly"
<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))
使用navigation通过一个动作(使用方向class)时很容易通过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>
使用类型安全的方式是个好主意,因为它会给你带来编译时安全和一些便利。
此库将构建参数的 class MyDestinationArgs
。您可以使用它来构建 Bundle
并以这种方式将结果传递到目标:
val args = DetailFragmentArgs.Builder("template_code").build().toBundle()
navController?.navigate(R.id.confirmationAction, args)
在接收方,您也可以使用参数 class:
检索数据val templateCode = SecondFragmentArgs.fromBundle(arguments).templateCode
如果由于某些原因我们不能使用 safeargs 库,
我们也可以在 Bundle
内部传递数据。假设你添加了
const val ARG_TEMPLATE_CODE = "templateCode"
DetailFragment
的 companion 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
现在来自目的地 activity 的常量):
intent?.extras?.getString(ARG_TEMPLATE_CODE)
安全的方法是在需要导航到片段的情况下定义全局操作"directly"
<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))