首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

既然setTargetFragment()已被弃用,如何替换它

setTargetFragment()方法在Android的Fragment API中已被弃用,主要是因为它可能导致内存泄漏和难以追踪的生命周期问题。取而代之的是使用FragmentResultListener来在Fragment之间进行通信。

基础概念

FragmentResultListener是Android Jetpack中的一个组件,用于在Fragment之间传递结果。这种方式更加安全和可靠,因为它避免了直接引用目标Fragment,从而减少了内存泄漏的风险。

优势

  1. 避免内存泄漏:不再需要持有目标Fragment的引用。
  2. 生命周期安全FragmentResultListener会在适当的生命周期回调中进行注册和注销。
  3. 简化代码:使用更简洁的API进行Fragment间通信。

类型

FragmentResultListener是一个接口,你需要实现它的onFragmentResult()方法来处理传递的结果。

应用场景

当你需要在两个Fragment之间传递数据时,可以使用FragmentResultListener。例如,一个Fragment需要从另一个Fragment获取数据。

示例代码

以下是如何使用FragmentResultListener来替换setTargetFragment()的示例:

发送结果的Fragment

代码语言:txt
复制
public class SenderFragment extends Fragment {
    private static final String REQUEST_KEY = "requestKey";

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        // 设置结果监听器
        requireActivity().getSupportFragmentManager().setFragmentResultListener(
            REQUEST_KEY,
            this,
            new FragmentResultListener() {
                @Override
                public void onFragmentResult(@NonNull String requestKey, @NonNull Bundle result) {
                    // 处理接收到的结果
                    String data = result.getString("data");
                    // 更新UI或其他操作
                }
            }
        );

        // 发送结果到目标Fragment
        Bundle bundle = new Bundle();
        bundle.putString("data", "Hello from SenderFragment");
        requireActivity().getSupportFragmentManager().setFragmentResult(REQUEST_KEY, bundle);
    }
}

接收结果的Fragment

代码语言:txt
复制
public class ReceiverFragment extends Fragment {
    private static final String REQUEST_KEY = "requestKey";

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 注册结果监听器
        requireActivity().getSupportFragmentManager().setFragmentResultListener(
            REQUEST_KEY,
            this,
            new FragmentResultListener() {
                @Override
                public void onFragmentResult(@NonNull String requestKey, @NonNull Bundle result) {
                    // 处理接收到的结果
                    String data = result.getString("data");
                    // 更新UI或其他操作
                }
            }
        );
    }
}

参考链接

Fragment Result API

通过这种方式,你可以安全地在Fragment之间传递数据,同时避免了许多潜在的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券