How to pass result from second fragment to first fragment

One of the possible solutions:

public class DetachableResultReceiver extends ResultReceiver {

private Receiver mReceiver;

public DetachableResultReceiver(Handler handler) {
    super(handler);
}

public void clearReceiver() {
    mReceiver = null;
}

public void setReceiver(Receiver receiver) {
    mReceiver = receiver;
}

public interface Receiver {
    public void onReceiveResult(int resultCode, Bundle resultData);
}

@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
    if (mReceiver != null) {
        mReceiver.onReceiveResult(resultCode, resultData);
    }
}
}

First fragment implements DetachableResultReceiver.Receiver and creates DetachableResultReceiver object:

mReceiver = new DetachableResultReceiver(new Handler());
mReceiver.setReceiver(this);

Then you can pass it to second fragment arguments:

Bundle bundle = new Bundle();
bundle.putParcelable(Consts.EXTRA_RECEIVER, receiver);
fragment.setArguments(bundle);

And use it in second fragment:

receiver = getArguments().getParcelable(Consts.EXTRA_RECEIVER);
receiver.send(Consts.SOME_MESSAGE, someData);

Update

Activity is the parent controller and should take responsibility for handling those events raised by its fragments/views, which concern something outside of the scope of fragment/view itself.

A Fragment is to act as a sub-controller of Views it hosts. All the events and communication between its own views, the fragment should handle itself. When there is an event outside of a fragment's scope and responsibilities (like sending data to another fragment), that event should be escalated to its parent controller, the Activity.

enter image description here

Old

From this tutorial : http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity

Its better to let the activity apply changes to its fragment than passing values directly between fragments. Let your Activity implement a FragmentListener interface with onQuery(Bundle data) and onResult(Bundle data) methods.

Create a FragmentListener varaible in each of your fragments and then override onAttach() of each fragment as:

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

    //---register parent activity for events---
    try{
        fragmentListener = (FragmentListener) activity;
    }catch (ClassCastException e)
    {
        throw new ClassCastException("Parent activity must implement interface FragmentListener.");
    }
  }

This will enforce your child fragments to be automatically registered to parent Activity.

Also, remember to release fragmentListener reference in onDetach().

Now you can call your Activity from fragments.

On the other side, your Activity can always search for a fragment using getFragmentManager().findFragmentByTag("fragmentA") or findFragmentById("FragmentA"). If it can find your Fragment, Then it can cast it into your FragmentA class and call its methods. Same can be done with FragmentB or any other fragment..