Naruto
Naruto

Reputation: 9634

Call parent fragment method from dialog fragment

I have a parent fragment, within this. Upon a button click, a child dialog fragment is getting created. Now I would like to know how to call parent fragment function from child dialog fragment.

Here is the sample code :

/**SampleFragment.java**/

public class SampleFragment extends Fragment {
    // Instantiate view & add event handlers    

    public void onButtonClick(....) {
        // Create a dialog framgent
    }

    public void refreshView() {

    }
}

/**SampleDialogFragment.java**/

public class SampleDialogFragment extends DialogFragment {
    // Instantiate view for dialog

    public void onButtonClick(...) {
        // Call parent fragment method, i.e call refreshView() of SampleFragment 
    }
}

Upvotes: 11

Views: 17636

Answers (4)

Anant Shah
Anant Shah

Reputation: 4044

In a Fragment:

SampleDialogFragment dialogFragment = new SampleDialogFragment();
dialogFragment.show(getChildFragmentManager());

In a DialogFragment:

((SampleFragment) getParentFragment()).refreshView();

After calling this method, you can access public methods of a parent fragment.

Upvotes: 18

Ashish Tamrakar
Ashish Tamrakar

Reputation: 821

The best way is to go for interface, declare an interface in nested fragment -

public interface checkingClickListener { public void checkingClickListener(String data); }

then attach this interface to parent fragment -

public void onAttachFragment(Fragment fragment)
    {
        try
        {
            clickListener = (checkingClickListener) fragment;

        } catch (ClassCastException e)
        {
              throw new ClassCastException(fragment.toString() + " must implement checkingClickListener");
        }
     }


     @Override
     public void onCreate(Bundle savedInstanceState)
     {
        Log.i(TAG, "onCreate");
        super.onCreate(savedInstanceState);

        this.mContext = getActivity().getApplicationContext();
        onAttachFragment(getParentFragment());
        ....
     }

you need to call this listener on some button click -

@Override
public void onClick(View v)
{
    switch (v.getId())
    {
        case R.id.tv_submit:
            if (clickListener != null)
            {                
                clickListener.checkingClickListener("sending data");
            }
            break;
    }
}

Implement this interface in parent fragment -

public class Fragment_Parent extends Fragment implements Nested_Fragment.checkingClickListener
{
      ....
     @Override
     public void checkingClickListener(final List<Player> players_list)
     {
           FragmentManager fragmentManager = getChildFragmentManager();
           SomeOtherNestFrag someOtherNestFrag = (SomeOtherNestFrag)  fragmentManager.findFragmentByTag([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.
           }
     }
}

Hope this helps you.

Upvotes: 0

SteD
SteD

Reputation: 14025

In say your parent fragment, SettingsFragment for example. Note the setTargetFragment()

public void onButtonClick(....)
{
            PrefLanguageDialogFragment prefLang = PrefLanguageDialogFragment.newInstance();
            prefLang.setTargetFragment(SettingsFragment.this, 1337);
            prefLang.show(getFragmentManager(), "dialog");
}

In our dialog, note the getTargetFragment()

SettingsFragment frag = (SettingsFragment)getTargetFragment();
if(frag != null){
   frag.refreshSomething();
}

Upvotes: 10

mmlooloo
mmlooloo

Reputation: 18977

when you want add SampleFragment to your activity set it a tag, e.g "SampleFragment".

then

public void onButtonClick(...){

    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    SampleFragment parent = (SampleFragment)fm.findFragmentByTag("SampleFragment");
    parent.refreshview();
}

have not test it but it may help:-)

Upvotes: 0

Related Questions