Fragment使用时,要把数据传送给Activity 或者Fragment 那么就牵扯到 数据传递的过程了
1.控件的值获取跟传递
首先得到某控件里面的值(如:editText等),那么只要在Activity/fragment得到控件的引用,那么就可以得到该控件的相关值,也空set控件的值
所以只要得到引用就可以了
1.1.在Activity中得到Fragment中的控件:
代码:
<span style="font-size:18px;"><span style="white-space:pre"> </span>setContentView(R.layout.activity_main);
mFragmengManager = getFragmentManager();
transaction = mFragmengManager.beginTransaction();
fragment1 = new Fragment1();
Bundle bundle = new Bundle();
bundle.putString("name", "fragment1");
fragment1.setArguments(bundle);
transaction.replace(R.id.left, fragment1, "fragment1");
transaction.addToBackStack("fragment1");
transaction.commit();</span>
在Oncreate完成以后才可以访问fragment的控件,否则为null,因为在onCreate时 fragment的的View还没有加载,所以要注意各自的生命周期:
<span style="font-size:18px;"> <span style="background-color: rgb(255, 255, 255);"> Button buttonFragment = (Button) fragment1.getView().findViewById(R.id.fragment_button);
buttonFragment.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "Toast fragment1", Toast.LENGTH_SHORT).show();
}
});</span></span>
1.2在Fragment中得到Activity中的控件:
代码如下:
<span style="font-size:18px;">@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragmeng_f1, null);
<span style="background-color: rgb(204, 204, 204);">button = (Button) getActivity().findViewById(R.id.activity_button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getActivity(), "111111111", Toast.LENGTH_SHORT).show();
}
});
</span>
Bundle bundle = getArguments();
if (null != bundle){
String name = bundle.getString("name");
button.setText("name :" + name);
}
return view;
}</span>
1.3 在fragment中得到另一个fragment的控件
前面2中情况都是Activity中有fragment的引用, fragment可以getActivity()可以得到Activty的引用,而Fragment却没有方法得到另一个fragment的引用,要想得到另一个fragment得使用 FragmengManager.findFragmentByTag(tag)的方法了。
代码:
Activity中:
<span style="font-size:18px;"> setContentView(R.layout.activity_main);
mFragmengManager = getFragmentManager();
transaction = mFragmengManager.beginTransaction();
fragment1 = new Fragment1();
transaction.replace(R.id.left, fragment1, "fragment1");
fragment2 = new Fragment2();
transaction.replace(R.id.right, fragment2, "fragment2");
transaction.commit();
</span>
<span style="font-size:18px;">fragment2 中</span>
<span style="font-size:18px;"><strong>Fragment1 fragment1 = (Fragment1) mFragmengManager.findFragmentByTag("fragment1");</strong>
if (null != fragment1){
Button buttonFragment = (Button) fragment1.getView().findViewById(R.id.fragment_button);
buttonFragment.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getActivity(), "2222222222", Toast.LENGTH_SHORT).show();
}
});
}</span>
记得tag要唯一,而且给控件引用时,要注意各自的生命周期
2. Activity 传送给Fragment
2.1.使用setArguments的方法传递
使用代码:
mFragmengManager = getFragmentManager();
transaction = mFragmengManager.beginTransaction();
fragment1 = new Fragment1();
Bundle bundle = new Bundle();
bundle.putString("name", "fragment1");
fragment1.setArguments(bundle);
transaction.replace(R.id.left, fragment1, "fragment1");
transaction.addToBackStack("fragment1");
transaction.commit();
在Fragmnet中
<span style="white-space: pre;"> </span><span style="background-color: rgb(255, 255, 255);"><strong>Bundle bundle = getArguments();
<span style="white-space: pre;"> </span>if (null != bundle){
<span style="white-space: pre;"> </span>String name = bundle.getString("name");
<span style="white-space: pre;"> </span>button.setText("name :" + name);
<span style="white-space: pre;"> </span>}</strong></span>
2.2 frgament可以直接通过getActivity() 访问Activity中的值,但是要强制转换(主动获取)
如:String data = ((MainActivity)getActivity()).getdata();
Toast.makeText(getActivity(), "data = " + data, Toast.LENGTH_SHORT).show();
2.3 使用接口回调,当Activity 的数据改变时通知fragment(自动接收)
首先创建接口
public interface CallBack {
public void getResult(String data , int id);
}
fragmnet中实现接口:
public class Fragment1 extends MyBaseFragment implements CallBack{
@Override
public void getResult(String data, int id) {
Toast.makeText(getActivity(), "data = " + data + " id = " + id, Toast.LENGTH_SHORT).show();
}
}
在Activity中注册(赋值)
registerCallback(fragment1);
public void registerCallback(CallBack back){
this.mCallBack = back;
}// 直接= 也可以 mCallBack = fragment1
最后是触发事件:可以是button点击 , 下载数据完成 等fragment关心的数据变化等都可以
如:button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mCallBack != null){
mCallBack.getResult(data, 10001);
}
}
});
3. fragment 传送给Activity ,注意在fragment中setArguments这个方法行不通 ,调试时会报错,具体原因现在没有深究
3.1Activity中有fragment的引用,直接访问就是了 (主动获取)
3.2 接口回调的方式 (自动接收)
4. fragment 传递跟fragment
比第3点对一个操作,就是先得另一个fragment的引用,然后就可以直接访问,跟设置接口回调了
得到另一个fragmnent的引用在1.3中有写到