Fragment 数据交互方式
在 Android 开发里,Fragment 之间的数据交互有多种方式,下面为你详细介绍:
1. 通过 Activity 作为中介
Activity 是连接各个 Fragment 的桥梁,可在 Activity 中定义数据和方法,Fragment 借助获取 Activity 的实例来实现数据交互。
实现步骤
- 在 Activity 里定义数据和用于获取、设置数据的方法。
- Fragment 获取 Activity 实例,进而调用这些方法。
示例代码
// 在 Activity 中定义数据和方法 public class MainActivity extends AppCompatActivity { private String data; public void setData(String data) { this.data = data; } public String getData() { return data; } } // 在 FragmentA 中设置数据 public class FragmentA extends Fragment { @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); MainActivity activity = (MainActivity) getActivity(); if (activity != null) { activity.setData("Hello from FragmentA"); } } } // 在 FragmentB 中获取数据 public class FragmentB extends Fragment { @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); MainActivity activity = (MainActivity) getActivity(); if (activity != null) { String data = activity.getData(); // 使用获取到的数据 } } } |
2. 使用接口回调
定义一个接口,让 Activity 实现该接口,Fragment 调用接口方法把数据传递给 Activity,Activity 再将数据传递给其他 Fragment。
实现步骤
- 定义一个接口,接口中包含传递数据的方法。
- 让 Activity 实现该接口。
- 在 Fragment 中设置接口实例,并调用接口方法传递数据。
示例代码
// 定义接口 public interface OnDataPass { void onDataPass(String data); } // 在 Activity 中实现接口 public class MainActivity extends AppCompatActivity implements OnDataPass { @Override public void onDataPass(String data) { // 将数据传递给其他 Fragment FragmentB fragmentB = (FragmentB) getSupportFragmentManager().findFragmentById(R.id.fragmentB); if (fragmentB != null) { fragmentB.updateData(data); } } } // 在 FragmentA 中调用接口方法传递数据 public class FragmentA extends Fragment { private OnDataPass dataPasser; @Override public void onAttach(@NonNull Context context) { super.onAttach(context); dataPasser = (OnDataPass) context; } public void sendDataToFragmentB() { dataPasser.onDataPass("Hello from FragmentA"); } } // 在 FragmentB 中更新数据 public class FragmentB extends Fragment { public void updateData(String data) { // 更新 UI 显示数据 } } |
3. 使用 EventBus
EventBus 是一个用于简化组件间消息传递的开源库,Fragment 可通过发布和订阅事件来进行数据交互。
实现步骤
- 添加 EventBus 依赖。
- 定义事件类。
- 在发送数据的 Fragment 中发布事件。
- 在接收数据的 Fragment 中订阅事件。
示例代码
// 添加 EventBus 依赖 implementation 'org.greenrobot:eventbus:3.3.1' // 定义事件类 public class MessageEvent { public final String message; public MessageEvent(String message) { this.message = message; } } // 在 FragmentA 中发布事件 public class FragmentA extends Fragment { public void sendData() { EventBus.getDefault().post(new MessageEvent("Hello from FragmentA")); } } // 在 FragmentB 中订阅事件 public class FragmentB extends Fragment { @Override public void onStart() { super.onStart(); EventBus.getDefault().register(this); } @Override public void onStop() { EventBus.getDefault().unregister(this); super.onStop(); } @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(MessageEvent event) { String message = event.message; // 使用接收到的数据 } } |
4. 使用 ViewModel
ViewModel 可在不同的 Fragment 之间共享数据,它的生命周期和 Activity 绑定,不受 Fragment 重建的影响。
实现步骤
- 添加 ViewModel 依赖。
- 创建 ViewModel 类。
- 在 Fragment 中获取 ViewModel 实例,进行数据的读写操作。
示例代码
// 添加 ViewModel 依赖 implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2' // 创建 ViewModel 类 import androidx.lifecycle.ViewModel; public class SharedViewModel extends ViewModel { private MutableLiveData<String> sharedData = new MutableLiveData<>(); public void setData(String data) { sharedData.setValue(data); } public LiveData<String> getData() { return sharedData; } } // 在 FragmentA 中设置数据 public class FragmentA extends Fragment { private SharedViewModel sharedViewModel; @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); sharedViewModel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class); sharedViewModel.setData("Hello from FragmentA"); } } // 在 FragmentB 中获取数据 public class FragmentB extends Fragment { private SharedViewModel sharedViewModel; @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); sharedViewModel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class); sharedViewModel.getData().observe(getViewLifecycleOwner(), data -> { // 使用获取到的数据 }); } } |
以上这些方式都能实现 Fragment 之间的数据交互,你可以依据具体的需求和场景来选择合适的方式。