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

myBase笔记: https://github.com/ycyangchun/androidNode

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值