如何将数据从启动另一个片段的片段传输到活动

时间:2015-08-10 08:51:12

标签: android android-fragments android-activity

我有一个调用另一个fragmentA的活动。现在这个fragmentA调用另一个fragmentB。现在我想将数据从fragmentB传输到我的活动

4 个答案:

答案 0 :(得分:2)

检查一下:Communicating with Other Fragments

定义接口(片段中)

要允许Fragment与其Activity进行通信,您可以在Fragment类中定义接口并在Activity中实现它。 Fragment在其onAttach()生命周期方法中捕获接口实现,然后可以调用Interface方法以与Activity通信。

以下是片段到活动通信的示例:

public class HeadlinesFragment extends ListFragment {
    OnHeadlineSelectedListener mCallback;

    // Container Activity must implement this interface
    public interface OnHeadlineSelectedListener {
        public void onArticleSelected(int position);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (OnHeadlineSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }

    ...
}

现在,片段可以通过使用OnHeadlineSelectedListener接口的mCallback实例调用onArticleSelected()方法(或接口中的其他方法)来向活动传递消息。

例如,当用户单击列表项时,将调用片段中的以下方法。该片段使用回调接口将事件传递给父活动。

@Override
public void onListItemClick(ListView l, View v, int position, long id)   {
    // Send the event to the host activity
    mCallback.onArticleSelected(position);
}

实现接口(在活动中)

为了从片段接收​​事件回调,托管它的活动必须实现片段类中定义的接口。

例如,以下活动实现了上例中的接口。

public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...

    public void onArticleSelected(int position) {
        // The user selected the headline of an article from the HeadlinesFragment
        // Do something here to display that article
    }
}

PS1 :EventBus适合您,但如果您需要,请仔细使用它,这可能会让您的代码更难阅读。

PS2 :不要在Fragment.newInstance()中传递活动实例并使用它进行通信。活动实例可能在后台销毁。像Fragment.onAttach()中的活动实例一样,框架将处理destroy&重建&为你重新绑定。

答案 1 :(得分:1)

您可以通过覆盖onAttach()方法获取Activity实例

方法:1

private Mail m;
m = new Mail("tester@hotmail.com", "passtester");
String[] toArr = {"test@hotmail.com"};
m.setTo(toArr); 
m.setFrom("test@hotmail.com"); 
m.setSubject("Subject");
m.setBody(""+ticket_id \n ""+Here put image[bytes?] );

@Override
public void onAttach(Activity activity) {
    // TODO Auto-generated method stub
    super.onAttach(activity);
    this.activity=(ActivityName) activity;
}

方法:2

    activity.setdata(yourdata);

在这些方面,您需要在活动中创建一个setter方法

这是从任何片段到其父活动进行回调的最简单方法。很好地解释了Dev Doc here

答案 2 :(得分:0)

您可以通过调用fragmentB中的getActivity()来获取活动的实例,并使用接口传递数据。

答案 3 :(得分:0)

您可以使用 EventBus ,如果您认为,您需要在应用的不同部分使用类似功能,并且您不想为此海豚编写许多界面。 您可以使用https://github.com/greenrobot/EventBus

示例:

添加编译' de.greenrobot:eventbus:2.4.0', 注册活动 OnCreate -

EventBus.getDefault().register(this);

和OnDestroy-

EventBus.getDefault().unregister(this);

添加一个带有接收对象参数和onEventMainThread名称的方法:

public void onEventMainThread(YourObject name) {...}

现在你可以致电

EventBus.getDefault().post(yourObjectInstance);

活动会检测到它。

或者您可以使用 RxJava 来获得类似的效果 - http://nerds.weddingpartyapp.com/tech/2014/12/24/implementing-an-event-bus-with-rxjava-rxbus/