Activity与Fragment通过Handler交互

作者: badc59a1a8c4 | 来源:发表于2017-08-09 00:15 被阅读75次

    自去年七月份以后,就没有再动过笔了。为这段长达半年多的懈怠感到羞愧。唉,言归正传,上代码吧。
    正常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,就只要将这套方法反过来写就可以了。

    相关文章

      网友评论

        本文标题:Activity与Fragment通过Handler交互

        本文链接:https://www.haomeiwen.com/subject/wtzxrxtx.html