探索Fragment(2)---数据交互
来源:互联网 发布:帝国时代2 mac版 编辑:程序博客网 时间:2024/04/29 18:45
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() {@Overridepublic 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;">@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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中有写到
- 探索Fragment(2)---数据交互
- Fragment与Fragment之间的数据交互
- Fragment间数据交互(一)
- 使用Fragment实现简单的数据交互
- activity与fragment之间的数据交互
- fragment与activity实现数据交互
- EventBus实现activity跟fragment交互数据
- Android Activity与Fragment 数据交互
- Fragment与Activity之间的数据交互
- Fragment的数据交互 一 使用Handler
- Fragment与Activity之间的数据交互
- android Fragment与Activity之间数据交互
- fragment和activity之间进行数据交互
- android中fragment简单使用以及fragment之间数据交互
- Fragment信息交互之Fragment获取DialogFragment的返回数据
- Fragment信息交互之Fragment获取DialogFragment的返回数据
- Android fragment和activity之间的数据传递交互
- android Fragment与Activity交互,互相发数据(附图详解)
- 第11周项目三程序的多文件组织
- C++ Builde 2010 MDI 调用 DLL 子窗体
- 第12周项目3-用递归法求解(1)
- 能够识别图片文字的软件有吗
- 使用php实现openfire的用户数据注册
- 探索Fragment(2)---数据交互
- linux上mysqldump导出的数据在windows上source导入报错的解决办法
- jquery.flot.js 简单使用
- 一步一步学zedboard之三生成FPGA配置文件
- oracle创建表之前判断表是否存在,如果存在则删除已有表
- js判断微信客户端
- 通过Navicat for MySQL远程连接的时候报错mysql 1130的解决方法
- 第十一周项目六——素数
- poj 3255 Roadblocks