Activity与Fragment通过Handler交互

        自去年七月份以后,就没有再动过笔了。为这段长达半年多的懈怠感到羞愧。唉,言归正传,上代码吧。

正常activity与fragment的交互,如果有跳转的话,就是直接用intent和bundle来进行数据的传递就可以的。但我们在项目中遇到的经常不是直接跳转这样简单的交互,在同一个activity中同时存在多个fragment,当activity的点击事件,或者是触摸事件相应的时候,要同时更新fragment的ui显示,或者在同一个activity中,fragmentA响应事件但是其发生的数据变化,同样是要在fragmentB和activity中显示。这个时候用我们对跳转的方法来处理数据,就做不到了,这个时候就要用到handler了。

         首先介绍一下思路:假设我们在activity中点击按钮时flag发生改变,fragment要根据flag更新ui。这个时候实现动作变化的是fragment,所以第一步我们要在fragment中new一个handler,并复写handlermessage方法:

public class TestFragment extends Fragment{
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            //在这里实现ui更新的效果
        }
    };
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 
@Nullable Bundle savedInstanceState) {
        return super.onCreateView(inflater, container, savedInstanceState);
    }
}
          那么第二步:既然是activity响应的事件,那么message肯定是activity发出的了。不管他,先创建一个handler变量发一个数据。

public class Test_Activity extends Activity implements View.OnClickListener{
    private Handler handler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    @Override
    public void onClick(View v) {
        Message message = new Message();
        Bundle bundle = new Bundle();
        bundle.putSerializable("hehe",new Test_Bean("张三","110"));
        message.setData(bundle);//这里模拟的是传递对象数据
        handler.sendMessage(message);
    }
}
         好了,最关键的一步来了,我们都知道,这样传递数据,肯定是要在同一个handler对象中才能做到,那么如何在activity中获取我们在fragment中创建的handler对呢。我们必须把这一步拆解成两步。第一:获取activity的实例,第二:将fragment中的handler对象传递到activity中去。

         获取fragment中的activity实例,在fragment中有提供一个方法给我们,我们只需要重写一下这个方法。onAttach是在fragment与activity交互的是后系统自动调用的,有不清楚的可以去了解一下fragment的生命周期。

private Test_Activity testActivity;
@Override
public void onAttach(Context context) {
    super.onAttach(context);
    testActivity = (Test_Activity) context;
}
         接下来传递handler对象,就很简单了,在activity中写一个公共的setHandler方法:

public void setHandler(Handler handler){
    this.handler = handler;
}
       然后在fragment中的onAttach方法中调用这个方法,将handler传入即可。

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    testActivity = (Test_Activity) context;
    testActivity.setHandler(handler);
}
       最后,便是在handlermesage中解析对象数据,更新ui了

private Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
       Bundle bundle = msg.getData();
       Test_Bean test_bean = (Test_Bean) bundle.getSerializable("hehe");
        //在这里实现ui更新的效果
    }
};
           如果是fragment响应事件,activity更新ui,就只要将这套方法反过来写就可以了。















  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值