一、Fragment和activity之间如何通信
Activity与Fragment之间通信的多种方式_东东旭huster的博客-CSDN博客_fragment和activity通信
1、通过bundle,在Activity中构造Fragment的时候,可以将需要传递的数据封装在成一个Bundle对象,然后通过setArguments()方法传递参数,例子如下
Activity
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
Fragment fragTop = new FrameTop();
fragmentTransaction.replace(R.id.frame1,fragTop);
Bundle bundle = new Bundle();
fragTop.setArguments(bundle);
bundle.putString("name","fragTop");
fragmentTransaction.commit();
Fragment中获取数据
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
Bundle arguments = getArguments();
String name = arguments.getString("name");
}
2、通过广播
3、通过EventBus,通过EventBus不仅可以实现Activity与Fragment, 还可以实现Fragment与Fragment之间通信
4、通过接口回调,这种方式在Android中非常普遍,这里也不详细的介绍了,一般就是在Activity中实现一个回调接口,然后将该接口注册到Fragment中,Fragment中就可以通过该接口与Activity通信了。
5、通过ViewModel,
viewModel是jetPack中一个非常好用的工具,假设您有一个 Fragment,在该 Fragment 中,用户从列表中选择一项,还有另一个 Fragment,用于显示选定项的内容。这种情况不太容易处理,因为这两个 Fragment 都需要定义某种接口描述,并且所有者 Activity 必须将两者绑定在一起。此外,这两个 Fragment 都必须处理另一个 Fragment 尚未创建或不可见的情况。
可以使用 ViewModel 对象解决这一常见的难点。这两个 fragment 可以使用其 activity 范围共享 ViewModel 来处理此类通信,如以下示例代码所示:
public class SharedViewModel extends ViewModel {
private final MutableLiveData<Item> selected = new MutableLiveData<Item>();
public void select(Item item) {
selected.setValue(item);
}
public LiveData<Item> getSelected() {
return selected;
}
}
public class ListFragment extends Fragment {
private SharedViewModel model;
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
itemSelector.setOnClickListener(item -> {
model.select(item);
});
}
}
public class DetailFragment extends Fragment {
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
SharedViewModel model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
model.getSelected().observe(getViewLifecycleOwner(), item -> {
// Update the UI.
});
}
}
6、通过Handler
7、跨Activity的Fragment之间通信,使用startActivityResult
1、FragmentA 调用 startActivityForResult() 方法之后,跳转到 ActivityB 中,ActivityB 把数据通过 setArguments() 设置给 FragmentB。
2、FragmentB 调用 getActivity().setResult() 设置返回数据,FragmentA 在onActivityResult() 中拿到数据。
此时,有两点需要特别注意:
1、不要使用 getActivity().startActivityForResult() , 而是在Fragment中直接调用startActivityForResult()。
2、activity 需要重写 onActivityResult,其必须调用 super.onActivityResult(requestCode, resultCode, data)。
以上两点如果违反,则 onActivityResult 只能够传递到 activity 的,无法传递到 Fragment。
二、fragment四种提交方式区别
https://www.jianshu.com/p/78136d0d3501