Sending data from nested fragments to parent fragment Sending data from nested fragments to parent fragment android android

Sending data from nested fragments to parent fragment


The best way is use an interface:

  1. Declare an interface in the nest fragment

    // Container Activity or Fragment must implement this interfacepublic interface OnPlayerSelectionSetListener{    public void onPlayerSelectionSet(List<Player> players_ist);}
  2. Attach the interface to parent fragment

    // In the child fragment.public void onAttachToParentFragment(Fragment fragment){    try    {        mOnPlayerSelectionSetListener = (OnPlayerSelectionSetListener)fragment;    }    catch (ClassCastException e)    {          throw new ClassCastException(              fragment.toString() + " must implement OnPlayerSelectionSetListener");    }}@Overridepublic void onCreate(Bundle savedInstanceState){    Log.i(TAG, "onCreate");    super.onCreate(savedInstanceState);    onAttachToParentFragment(getParentFragment());    // ...}
  3. Call the listener on button click.

    // In the child fragment.@Overridepublic void onClick(View v){    switch (v.getId())    {        case R.id.tv_submit:            if (mOnPlayerSelectionSetListener != null)            {                                 mOnPlayerSelectionSetListener.onPlayerSelectionSet(selectedPlayers);            }            break;        }    }
  4. Have your parent fragment implement the interface.

     public class Fragment_Parent extends Fragment implements Nested_Fragment.OnPlayerSelectionSetListener {      // ...      @Override      public void onPlayerSelectionSet(final List<Player> players_list)      {           FragmentManager fragmentManager = getChildFragmentManager();           SomeOtherNestFrag someOtherNestFrag = (SomeOtherNestFrag)fragmentManager.findFragmentByTag("Some fragment tag");           //Tag of your fragment which you should use when you add           if(someOtherNestFrag != null)           {                // your some other frag need to provide some data back based on views.                SomeData somedata = someOtherNestFrag.getSomeData();                // it can be a string, or int, or some custom java object.           }      } }

Add Tag when you do fragment transaction so you can look it up afterward to call its method. FragmentTransaction

This is the proper way to handle communication between fragment and nest fragment, it's almost the same for activity and fragment.http://developer.android.com/guide/components/fragments.html#EventCallbacks

There is actually another official way, it's using activity result, but this one is good enough and common.


Instead of using interface, you can call the child fragment through below:

( (YourFragmentName) getParentFragment() ).yourMethodName();


The best way to pass data between fragments is using Interface. Here's what you need to do:In you nested fragment:

public interface OnDataPass {    public void OnDataPass(int i);}OnDataPass dataPasser;@Overridepublic void onAttach(Activity a) {    super.onAttach(a);    dataPasser = (OnDataPass) a;}public void passData(int i) {    dataPasser.OnDataPass(i);}

In your parent fragment:

public class Fragment_Parent extends Fragment implements OnDataPass {...    @Override    public void OnDataPass(int i) {        this.input = i;    }    btnOk.setOnClickListener(new OnClickListener() {        @Override        public void onClick(View v) {            Fragment fragment = getSupportFragmentManager().findFragmentByTag("0");            ((Fragment_Fr1) fragment).passData();        }    }}