Reputation: 7458
According to the Google's docs:
You can now embed fragments inside fragments. This is useful for a variety of situations in which you want to place dynamic and re-usable UI components into a UI component that is itself dynamic and re-usable. For example, if you use ViewPager to create fragments that swipe left and right and consume a majority of the screen space, you can now insert fragments into each fragment page. To nest a fragment, simply call getChildFragmentManager() on the Fragment in which you want to add a fragment. This returns a FragmentManager that you can use like you normally do from the top-level activity to create fragment transactions. For example, here’s some code that adds a fragment from within an existing Fragment class:
Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();
So I had (for example) TestFragment
which looks like:
public class TestFragment extends Fragment {
private View mFragmentView;
private FrameLayout mFrameLayout;
public HistoryFragment() {
super();
}
@Override
public View onCreateView(LayoutInflater pInflater, ViewGroup pViewGroup, Bundle pBundle) {
mFragmentView = pInflater.inflate(R.layout.fragment_layout, pViewGroup, false);
mFrameLayout = (FrameLayout) mFragmentView.findViewById(R.id.framelayout);
return mFragmentView;
}
public void onDestroyView() {
super.onDestroyView();
}
/* ISSUE */
public void doSomethingSpecial() {
FragmentManager tFragmentManager = getChildFragmentManager();
}
}
At the MainActivity
I initialize my fragment like:
mTestFragment = new TestFragment();
mTestFragment.doSomethingSpecial();
Then I pass fragment to ViewPager
via FragmentPagerAdapter
.
Finally, I get an exception. But if I use only:
mTestFragment = new TestFragment();
Then it works.
Where should I call getChildFragmentManager()
method in my fragment? What I am doing wrong?
If you have a good example of using new Android Nested Fragments please share link with me. I would greatly appreciate for your help.
Upvotes: 12
Views: 31403
Reputation: 1028
Actually I Just used in the following case.
I was trying to add a Map into a ViewPager. As you may know, the "pages" in the ViewPager are Fragments, so I was unable to use this code Sample using maps from an Activity. I was trying to get the SupportMapFragment from the Activity doing things like:
SupportMapFragment mapView = (SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map);
But mapView was always null, so my application crashes.
I found the following answer and works inmediatly.
This can be an useful example where to use getChildFragmentManager()
Hope this can be helpful.
Upvotes: 0
Reputation: 10971
According to the docs, this method:
Return a private FragmentManager for placing and managing Fragments inside of this Fragment.
So you can use it if you want to add/replace a new fragment to your existing fragment, you should commit your TestFragment transaction first, then add the inner fragment to it. try something like this:
TestFragment mTestFragment = new TestFragment();
//get the activity's fragment manager to add the fragment
FragmentTransaction transaction= getFragmentManager().beginTransaction();
transaction.add(R.id.container, mTestFragment).commit();
//add the inner fragment
mTestFragment.doSomethingSpecial();
Upvotes: 0
Reputation: 18891
Short answer: I call and use getChildFragmentManager()
in my Fragment's onViewCreated()
method.
For example:
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
addInnerFragment(); // This method does the getChildFragmentManager() stuff.
}
Upvotes: 4