Fragment与Activity的相互通信(二)

简介: 之前用的是接口回调与广播通信来实现fragment与activity之间的相互通信。 http://blog.csdn.net/tyk0910/article/details/50405663最近公司项目用的是EventBus,开始研究EventBus的实战应用。

之前用的是接口回调与广播通信来实现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

以后有用到的地方会持续更新。

目录
相关文章
|
Android开发
Android 中Fragment和Activity之间的通信
Android 中Fragment和Activity之间的通信
64 0
|
XML Java 数据格式
Fragment之间传递数据
画面显示(XML) 首先这是一个Activit显示上有两个Fragment容器,是为了显示两个Fragment。 然后Activity加载了两个Fragment的数据并依次replace到了两个容器中。 此时Activity就有了两个Fragment的对象,方便后续FragmentA获取FragmentB。
148 0
|
Android开发
【Android 应用开发】Activity生命周期 与 Activity 之间的通信
【Android 应用开发】Activity生命周期 与 Activity 之间的通信
148 0
【Android 应用开发】Activity生命周期 与 Activity 之间的通信
|
JSON Java 数据格式
Activity之间使用Intent传递大量数据带来问题
Intent在传递数据时是有大小限制的,这里官方并未详细说明,不过通过实验的方法可以测出数据应该被限制在1MB之(1024KB),采用的是传递某产品详情,发现当数据大小超过1024的时候,程序就会出现闪退、停止运行等异常(不同的手机反应不同),因此可以判断Intent的传输容量在1MB以内,但是根据不同版本、不同厂商,这个值会有区别。
423 0
|
容器
Fragment与Fragment相互切换之间的生命周期方法
最近一段时间忙于找工作,找到工作之后忙于项目上线,好久没有写过博客,现在感觉终于闲暇了,写一写这次项目中需要总结提炼的知识点,给自己留个印象吧,毕竟好记性不如烂笔头。
1575 0
|
XML Android开发 数据格式
Fragment与Activity之间的通信
前言 君子博学而日参省乎已,则知明而行无过矣。 要显示Fragment,必须将Fragment添加到Activity中。添加到Activity中有如下两种方式。
1181 0
|
.NET Android开发 开发框架