Activity与Fragment之间的交互主要有两种方式一种是通过setArguments(Bundle args)和getArguments()方法,另一种是通过回调机制。
我们以传递数据为例
1 通过setArguments(Bundle args)和getArguments()方法
在Activity中代码
FirstFragment firstFragment=new FirstFragment(); Bundle bundle=new Bundle(); bundle.putString("name","My FirstFragment"); firstFragment.setArguments(bundle); FragmentManager manager=getSupportFragmentManager(); FragmentTransaction transaction=manager.beginTransaction(); transaction.add(R.id.activity_main,firstFragment,"firstFragment"); transaction.commit();首先要实例化Fragment,实例化Bundle,并通过putString()方法绑定要传递的键值对,最后setArguments(bundle),这里setArguments(bundle)必须在Fragment.onAttach()方法执行之前调用。
private String name; private TextView mTextView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view=inflater.inflate(R.layout.first_fragment,container,false); name=getArguments().getString("name"); mTextView=(TextView)view.findViewById(R.id.text); mTextView.setText(name); return view; }在Fragment中getArgument().getString("name")方法获取value
2 回调机制
回调机制是一种双向的调用模式,即接口被调用时也会调用对方的接口,A调用B,B执行完后再调用A。主要用来实现多层之间的数据传递。
首先要定义一个接口
public interface DataCallBack { void getData(String data); }
然后创建一个控制类,把接收数据的类的地址给他
public class DataCallBackControl { DataCallBack mDataCallBack; public DataCallBackControl(DataCallBack mDataCallBack) { this.mDataCallBack=mDataCallBack; } public void data(String data) { mDataCallBack.getData(data); } }
接着Fragment要实现DataCallBack接口,并实现其中的方法
@Override public void getData(String data) { name=data; }
接下来是怎么触发去传递数据,实例化控制类,并将Fragment实例传进去,调用控制类的方法即可
public void putData() { String data="My FirstFragment"; DataCallBackControl control=new DataCallBackControl(new FirstFragment()); control.data(data); }
这样就可以实现Activity到Fragment的数据传输了。
最近又看到一种比较好的,Fragment向Activity传递数据,在fragment内部定义接口,调用getData方法,然后Activity去实现接口
//定义回调接口 public interface FragmentCallBack{ void getData(String data); } private FragmentCallBack mFragmentCallBack; @Override public void onAttach(Context context) { super.onAttach(context); mFragmentCallBack = (FragmentCallBack)getActivity(); }