Fragment与Activity的相互通信(二)
来源:互联网 发布:退出淘宝客 之前的链接 编辑:程序博客网 时间:2024/05/22 13:16
之前用的是接口回调与广播通信来实现fragment与activity之间的相互通信。
http://blog.csdn.net/tyk0910/article/details/50405663
最近公司项目用的是EventBus,开始研究EventBus的实战应用。先看效果图:
主界面一个普通的activity,最上面是当前activity的textview,整体线性垂直排列;两个edittext与一个button构成第一个fragment;一个textview构成第二个fragment。
业务就是点击第一个fragment里面的button,将两个edittext的值传递给activity以及第二个fragment进行显示。接口回调与广播通信之前已经用过,这里采用第三种方式–EventBus。
EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。
具体包括4个成分:发布者,订阅者,事件,总线。
3个方法:
EventBus.getDefault().register(this);//订阅事件
EventBus.getDefault().post(object);//发布事件
EventBus.getDefault().unregister(this);//取消订阅
接下来看看具体实现:
1.布局文件
<TextView android:id="@+id/txt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp" android:text="这里的值将会改变" /> <LinearLayout android:layout_marginTop="40dp" android:id="@+id/fragment_ll" android:layout_width="fill_parent" android:layout_height="200dp" android:orientation="vertical" > </LinearLayout> <LinearLayout android:layout_marginTop="40dp" android:id="@+id/second_fragment_ll" android:layout_width="fill_parent" android:layout_height="200dp" android:orientation="vertical" > </LinearLayout>
一个textView,两个线性linear layout,将来用fragment替换
2.代码实现
(1)下载EventBus的类库
我这里用的是鸿洋大神源码里面的jar包,直接拿来用就行
http://download.csdn.net/detail/lmj623565791/8126089
(2)自定义一个事件实体类,可以是空类,可以通过构造函数创建
public class Item { private String msg; public Item(){ } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; }}
(3)在需要接受消息的界面进行注册
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventBus.getDefault().register(this); }
activity与第二个fragment都需要接受消息,所以它们的onCreate()里面进行注册
(4)发送消息
public void onClick(View v) { Item item = new Item(); item.setMsg(usernameEdt.getText().toString() + " " + passwordEdt.getText().toString()); EventBus.getDefault().post(item); }
点击第一个fragment的button时候调用发送消息这个方法,使用EventBus中的Post方法来实现发送的,发送过去的是我们新建的类的实例
(5)接收消息
public void onEventMainThread(Item item) { String msg = item.getMsg(); txt.setText(msg); Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); }
接收消息时,我们使用EventBus中最常用的onEventMainThread()函数来接收消息。在MainActivity以及第二个Fragment中重写onEventMainThread(Item item),参数就是我们自己定义的类:
在收到Event实例后,我们将其中携带的消息通过get()方法取出,一方面Toast出去,一方面传到TextView中;
(6)解除注册
protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); }
在ondestory()进行解除操作
整体过程就是这样,最后贴一下MainActivity的代码:
public class MainActivity extends AppCompatActivity { private TextView txt; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventBus.getDefault().register(this); initviews(); } private void initviews() { txt = (TextView) findViewById(R.id.txt); Fragment fragment = new MyFragment(); Fragment secondfragment = new MySecondFragment(); FragmentTransaction fm = getFragmentManager().beginTransaction(); fm.replace(R.id.fragment_ll, fragment); fm.replace(R.id.second_fragment_ll,secondfragment); fm.commit(); } public void onEventMainThread(Item item) { String msg = item.getMsg(); txt.setText(msg); Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); }}
EventBus很适合模块之间的通信,这里只是它最基础的使用,关于它的详解原理,方法函数,源码解析可以参考:
http://blog.csdn.net/lmj623565791/article/details/40794879
http://blog.csdn.net/lmj623565791/article/details/40920453
http://blog.csdn.net/harvic880925/article/details/40660137
http://blog.csdn.net/harvic880925/article/details/40787203
以后有用到的地方会持续更新。
- Fragment与Activity的相互通信(二)
- Fragment与Activity的相互通信(一)
- Fragment与Activity之间的相互通信
- Fragment与Activity之间的相互通信
- Fragment与Activity相互通信研究总结
- Activity 与 Fragment 之间相互通信
- Fragment和Activity之间的相互通信
- Fragment和Activity之间的相互通信
- fragment与activity间的通信(二)
- Fragment与Activity的通信:
- Fragment与Activity的通信
- Fragment与Activity的通信
- Activity与Fragment的相互传值
- 备忘宝小项目的总结(二) Fragment 与 Activity,与Fragment之间的通信
- Activity与Fragment,Fragment与Fragment之间的通信
- Fragment与Fragment、Activity通信的四种方式(二)
- Fragment与Activity通信
- Fragment与Activity通信
- MATLAB中的分类器
- Java编程风格
- 首尾相连数组的最大子数组和
- tuxedo编译ubb文件的一个报错
- unity 第三期
- Fragment与Activity的相互通信(二)
- springmvc获取项目当前绝对路径,进行下载文件
- Linux下Hadoop2.6.0集群环境的搭建
- oracle数据库迁移
- 如何解决warning:implicit declaration of function 'xxx'
- 网络流与费用流(下)费用流
- ORACLE定时器停止运行
- sql执行结果
- 拓扑排序