Activity与Fragment,以及Fragment与Fragment之间的数据通讯
2016-05-22 19:26
369 查看
Activity和Fragment无疑是Android开发中使用最多的组件,如果Activity使用了多个Fragment,需要在Activity与Fragment,以及Fragment与Fragment之间进行数据通讯,这是开发时经常遇到的需求问题,其实在我没整理这篇blog前也遇到过这样的数据通讯需求,下面是后来整理的用接口回调的方式实现Fragment与Fragment之间,以及用Bundler实现Activity与Fragment之间数据通讯,希望能对大家有帮助.
通过接口回调,实现Fragment与Fragment之间数据通讯,逻辑如下:
1.创建一个接口,并在接口里面创建用于处理回调的函数,函数上面声明一个参数, 参数的数据类型是Fragment之间通讯的数据类型 2.在一个Fragment中创建用于注册回调的函数,函数上面声明一个参数,参数的数据类型是接口的类型 3.在另外的一个Fragment中创建一个内部类,并且将内部类实现回调的接口并实现接口中的函数, 然后在外部类中通过第一个Fragment的类名直接调用第一个Fragment中用于注册回调的函数, 将自己内部类的对象作为参数传递 4.实现数据传递时,只要第一个Fragment调用接口中处理数据的函数,那另外一个Fragment就会收到传递的数据
————————–以 下 是 代 码————————–
Activity(左边和右边各显示一个Fragment):
public class MainActivity extends Activity { private FragmentManager mManager; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取Fragment管理者 mManager= getFragmentManager(); // 默认左边边显示的Fragment FragmentTransaction leftTr= mManager.beginTransaction(); LeftFragment leftFragment = new LeftFragment(); leftTr.replace(R.id.fl_left, leftFragment); leftTr.commit(); // 默认右边显示的Fragment FragmentTransaction rightTr = mManager.beginTransaction(); RightFragment rightFragment= new RightFragment(); rightTr.replace(R.id.fl_right, rightFragment); rightTr.commit(); } }
处理回调的接口:
public interface DataListener { //处理数据的函数,接口的实现类必须实现此函数 void onData(String data); }
左边的Fragment:
public class LeftFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState{ View inflate = inflater.inflate(R.layout.left_fragment, null); //调用右边RightFragment的setOnDataListener函数注册接口回调 RightFragment.setOnDataListener(new OnDataListener()); return inflate; } //用于实现回调的类,实现的是处理回调的接口,并实现接口里面的函数 class OnDataListener implements DataListener{ //实现接口中处理数据的函数,只要右边的Fragment调用onData函数,这里就会收到传递的数据 public void onData(String data) { Toast.makeText(getActivity(), "data="+data, 0).show(); } } }
右边的Fragment:
public class RightFragment extends Fragment { private static DataListener mDataListener; private EditText mEdData; private Button mBtnPut; public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { View inflate = inflater.inflate(R.layout.right_fragment, null); mEdData = (EditText) inflate.findViewById(R.id.ed_data); mBtnPut= (Button) inflate.findViewById(R.id.btn_put); mBtnPut.setOnClickListener(new OnClickListener() { public void onClick(View v) { String data = mEdData.getText().toString(); //调用接口中处理数据的函数,这里实际是多态的方式调用的是实现类的函数 mDataListener.onData(data); } }); return inflate; } //创建注册回调的函数 public static void setOnDataListener(DataListener dataListener){ //将参数赋值给接口类型的成员变量 mDataListener = dataListener; } }
以上是所有的代码,至于Activity与Fragment之间通讯,可以沿用上面的逻辑去实现.
但是还可以用另外一种方法,就是用官方提供的Bundler去实现Activity传递数据到Fragment,
————————–以 下 是 代 码————————–Activity(传递数据):
public class MainActivity extends Activity { private FragmentManager mManager; private Button mBtnPutData; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBtnPutData = (Button) findViewById(R.id.btn_putData); //默认显示的Fragment mManager= getFragmentManager(); FragmentTransaction transaction = mManager.beginTransaction(); RightFragment fragment = new RightFragment(); transaction.replace(R.id.fl_content, fragment); transaction.commit(); //向RightFragment传值 mBtnPutData.setOnClickListener(new OnClickListener() { public void onClick(View v) { FragmentTransaction transaction = mManager.beginTransaction(); RightFragment fragment = new RightFragment(); //创建Bundle对象 Bundle bundle = new Bundle(); //向Bundle输入数据 bundle.putInt("data", 100); //对fragment设置Bundle参数 fragment.setArguments(bundle); transaction.replace(R.id.fl_content, fragment); transaction.commit(); } }); } }
Fragment(接收数据)
public class RightFragment extends Fragment{ private EditText mEtData; public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { View inflate = inflater.inflate(R.layout.right_fragment, container,false); mEtData = (EditText) inflate.findViewById(R.id.et_data); //获取Activity传递的Bundle对象 Bundle bundle = getArguments(); if(bundle != null){ //从bundle里面获取key为data的int类型数值 int data = bundle.getInt("data"); //将值设置到控件上 et_data.setText("data="+data); } return inflate; } }
————————–完 毕————————–
相关文章推荐
- 存储过程与事务
- 基于Bootstrap和Knockout.js的ASP.NET MVC开发实战
- URL编码中加入%原因
- 使用GestureDetector进行手势识别
- ASP.NET页面传值加号变空格解决办法
- Linux 监控tomcat,自动重启tomcat服务
- Tomcat进程运行监视并自动重启的脚本
- python核心编程2
- poj 2431 贪心+优先队列
- 科目三考试什么情况会被判定空挡滑行
- poj 3268 Bookshelf 2
- html
- SAX - DefaultHandler
- Windows2003操作系统SQL Server 2008安装图解(详细)
- 文章标题
- 为什么我又从 Node.js 回到 Python
- pwnable.kr write up 之 sample login
- storm-0.8.2集群模式安装部署
- XOJ4 树的构造
- 构造方法私有化和单例模式