setTargetFragment()
方法在Android的Fragment API中已被弃用,主要是因为它可能导致内存泄漏和难以追踪的生命周期问题。取而代之的是使用FragmentResultListener
来在Fragment之间进行通信。
FragmentResultListener
是Android Jetpack中的一个组件,用于在Fragment之间传递结果。这种方式更加安全和可靠,因为它避免了直接引用目标Fragment,从而减少了内存泄漏的风险。
FragmentResultListener
会在适当的生命周期回调中进行注册和注销。FragmentResultListener
是一个接口,你需要实现它的onFragmentResult()
方法来处理传递的结果。
当你需要在两个Fragment之间传递数据时,可以使用FragmentResultListener
。例如,一个Fragment需要从另一个Fragment获取数据。
以下是如何使用FragmentResultListener
来替换setTargetFragment()
的示例:
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);
}
}
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之间传递数据,同时避免了许多潜在的问题。
领取专属 10元无门槛券
手把手带您无忧上云