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