Fragment 之间传递数据(1)
了解 Fragment的
优势:
1、能够将activity分离成多个可重用的组件,每个都有它自己的生命周期和UI。
2、创建动态灵活的UI设计,可以适应于不同的屏幕尺寸。从手机到平板电脑
3、一个独立的模块,与activity绑定在一起。可以运行中动态地移除、加入、交换等,由 FragmentManager 管理。
4、解决Activity间的切换不流畅,轻量切换(比创建 activity 消耗资源少)。
5、是实现可复用的,模块化UI的良好组件。6、可以从startActivityForResult中接收到返回结果,但是View不能
缺点:
1、多个 fragment 的事件传递
2、fragment 之间的通信
一 ,解决多个 fragment 的事件传递穿透?
究其原因:Fragment 的本质就是一个 View 布局的管理器,当Fragment attach 到 Activity 时,其实就是把 Fragment # onCreateView() 返回的 View,替换掉(如果是用 replace) FragmentTransaction # replace 中指定的View,或者添加到(如果是add)FragmentTransaction # add()中指定的 viewGroup里面。当我们以层叠方式显示多个Fragment时,通常的做法就是弄一个FrameLayout,然后每次把Fragment add到此布局。因此,这时Activity的页面布局树实际上就是一个FrameLayout里面包含几个View。所以,当点击上面Fragment的空白区域时,如果事件没被吃掉,就会向下传递。
解决方案:
创建BaseFragement
public abstract class CJBaseFragment extends BaseFragment implements View.OnTouchListener {
public SweetAlertDialog pDialog;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
pDialog = new SweetAlertDialog(getActivity(), SweetAlertDialog.PROGRESS_TYPE);
pDialog.getProgressHelper().setBarColor(Color.parseColor("#FF4081"));
pDialog.setTitleText("正在加载中...");
pDialog.setCancelable(false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
// 拦截触摸事件,防止泄露下去
view.setOnTouchListener(this);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
}
其他Fragment可以继承CJBaseFragment这会让根布局把点击事件吃掉,以防止事件会继续传递下去,造成上面的情况。
二、fragment 之间的通信
通信原则:两个片段不能直接沟通(Tow Fragments should never communicate directly.)为了解耦合。
常用的几种通信方式:
1、Handler
(缺点: 1、耦合, 2、无法获取activity 的返回 ,3、内存泄漏)
2、static
(缺点: 内存消耗)
3、广播
(缺点: 1、性能差, 2、通信体系重 ,3、传播数据有限)
4、eventBus
(缺点: 1、反射,2、数据无返回,单向传播,3、将导致逻辑的分散,出现问题后难定位)
5、接口回调
优点:效率高,方便,解耦合
demo: https://github.com/ycyangchun/FragmentCommunication
上一篇: Java求 N 的阶乘