帮我实现一个Fragment 与 Fragment通信的组件
时间: 2024-02-01 21:40:51 浏览: 24
好的,我给你介绍两种常用的实现方式。
1. 接口回调
在 Fragment A 中定义一个接口,然后在 Fragment B 中实现该接口,这样 Fragment A 就可以通过该接口回调 Fragment B 中实现的方法。具体实现步骤如下:
在 Fragment A 中定义接口:
```
public interface OnFragmentInteractionListener {
void onFragmentInteraction(String data);
}
```
在 Fragment A 中创建该接口的实例:
```
private OnFragmentInteractionListener mListener;
```
在 Fragment A 中实现 onAttach() 方法,将该实例赋值为 Activity 的实例:
```
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
```
在 Fragment A 中需要通信的地方调用 mListener.onFragmentInteraction(data) 方法:
```
mListener.onFragmentInteraction(data);
```
在 Fragment B 中实现接口 OnFragmentInteractionListener:
```
@Override
public void onFragmentInteraction(String data) {
// 处理数据
}
```
2. ViewModel
通过 ViewModel 来实现 Fragment 之间的通信。具体实现步骤如下:
在 ViewModel 中定义需要共享的数据:
```
public class SharedViewModel extends ViewModel {
private MutableLiveData<String> mText = new MutableLiveData<>();
public void setText(String text) {
mText.setValue(text);
}
public LiveData<String> getText() {
return mText;
}
}
```
在 Fragment A 和 Fragment B 中分别获取 ViewModel:
```
private SharedViewModel mViewModel;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mViewModel = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
}
```
Fragment A 中需要通信的地方调用 mViewModel.setText(data) 方法:
```
mViewModel.setText(data);
```
Fragment B 中通过观察 mViewModel.getText() 来获取数据:
```
mViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
@Override
public void onChanged(@Nullable String data) {
// 处理数据
}
});
```
以上就是两种常用的实现方式,你可以根据自己的实际情况来选择其中一种方式。