Android JetPack Navigation:Fragment返回键用Safe Args回传数据
用Safe Args在返回键时回传数据(无需反向Action)
步骤1:在导航图中定义发送Fragment接收返回数据的参数
首先,在你的导航XML文件中,为**发送Fragment(SendFragment)**添加需要接收回传数据的<argument>,Safe Args会自动生成对应的类型安全参数解析类:
<navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/nav_graph" app:startDestination="@id/sendFragment"> <fragment android:id="@+id/sendFragment" android:name="com.example.SendFragment" android:label="SendFragment"> <!-- 添加接收回传数据的参数 --> <argument android:name="returnedContent" app:argType="string" app:nullable="true" /> <!-- 原有正向跳转的action --> <action android:id="@+id/action_send_to_receive" app:destination="@id/receiveFragment"> <!-- 正向传参的参数 --> <argument android:name="forwardContent" app:argType="string" /> </action> </fragment> <fragment android:id="@+id/receiveFragment" android:name="com.example.ReceiveFragment" android:label="ReceiveFragment"> <!-- 接收正向传参的参数 --> <argument android:name="forwardContent" app:argType="string" /> </fragment> </navigation>
步骤2:在接收Fragment中处理返回键逻辑
在**接收Fragment(ReceiveFragment)**中,通过OnBackPressedCallback(AndroidX推荐方式)拦截返回键,用Safe Args构建回传参数,设置到上一个BackStackEntry后弹出当前栈:
class ReceiveFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 拦截返回键操作 requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) { // 1. 用Safe Args Builder构建类型安全的回传参数 val returnArgs = SendFragmentArgs.Builder() .setReturnedContent("从接收页回传的内容") .build() // 2. 获取发送Fragment对应的上一个栈条目 val previousBackStackEntry = findNavController().previousBackStackEntry // 3. 将参数设置到上一个栈条目 previousBackStackEntry?.arguments = returnArgs.toBundle() // 4. 弹出当前Fragment栈 findNavController().popBackStack() // 标记回调已处理,避免重复触发 isEnabled = false } } }
步骤3:在发送Fragment中接收回传数据
在**发送Fragment(SendFragment)**中,通过Safe Args解析回传参数,推荐在onViewCreated或onResume中处理:
class SendFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 用Safe Args解析类型安全的回传参数 val args = SendFragmentArgs.fromBundle(requireArguments()) args.returnedContent?.let { returnedText -> // 处理回传数据,比如更新UI binding.tvReturnedContent.text = returnedText } } }
补充说明
如果仍使用旧的onBackPressed()重写方式,逻辑一致:
override fun onBackPressed() { val returnArgs = SendFragmentArgs.Builder() .setReturnedContent("回传内容") .build() findNavController().previousBackStackEntry?.arguments = returnArgs.toBundle() super.onBackPressed() }
这种方式全程依赖Safe Args的类型安全API,无需创建反向Action,也避免了手动操作Bundle的类型转换风险。
内容的提问来源于stack exchange,提问作者Ali Doran
相关产品推荐
相关产品推荐

