自去年七月份以后,就没有再动过笔了。为这段长达半年多的懈怠感到羞愧。唉,言归正传,上代码吧。
正常activity与fragment的交互,如果有跳转的话,就是直接用intent和bundle来进行数据的传递就可以的。但我们在项目中遇到的经常不是直接跳转这样简单的交互,在同一个activity中同时存在多个fragment,当activity的点击事件,或者是触摸事件相应的时候,要同时更新fragment的ui显示,或者在同一个activity中,fragmentA响应事件但是其发生的数据变化,同样是要在fragmentB和activity中显示。这个时候用我们对跳转的方法来处理数据,就做不到了,这个时候就要用到handler了。
首先介绍一下思路:假设我们在activity中点击按钮时flag发生改变,fragment要根据flag更新ui。这个时候实现动作变化的是fragment,所以第一步我们要在fragment中new一个handler,并复写handlermessage方法:
那么第二步:既然是activity响应的事件,那么message肯定是activity发出的了。不管他,先创建一个handler变量发一个数据。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); } }
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,就只要将这套方法反过来写就可以了。