You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 07:54:18