0

I have a problems making me sick for several days. My App consists only one activity with several main fragments. I have 2 FramentStatePageAdapter and the first one is replaced by the second one after choosing an item on it. But after orientation changes, the app crashes since the fragment manager in the second adapter couldn't get nested fragments. I use this method to replace main fragments:

public void replaceFragment(Fragment fragment, String tag){
        fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.add(R.id.container, fragment);
        fragmentTransaction.addToBackStack(tag);
        fragmentTransaction.commit();
        fragmentManager.executePendingTransactions();
        toolbar.setTitle(tag);
        updateUpButton();
    }

Initially, I replace a fragment called HomeTabsFragment consisting a FragmentStatePagerAdapter with 3 tabs and 3 nested fragment. This is how i created the adapter in HomeTabsFragment :

playTubeFragmentAdapter = new HomeTabsAdapter(getChildFragmentManager());

And here is the first adapter:

public class HomeTabsAdapter extends FragmentStatePagerAdapter {

    public static final String[] mFragmentTitles = {"Music", "Video", "Playlist"};
    private HashMap<Integer, BaseFragment> mPageReferenceMap;

    public HomeTabsAdapter(FragmentManager fm) {
        super(fm);
        mPageReferenceMap = new HashMap<>();
    }

    @Override
    public Fragment getItem(int position){
        BaseFragment fragment = null;

        switch (position){
            case 0:
                fragment = MusicGenreFragment.newInstance();
                break;
            case 1:
                fragment = VideoCategoryFragment.newInstance();
                break;
            case 2:
                fragment = PlayListFragment.newInstance();
                break;

        }

        mPageReferenceMap.put(position, fragment);
        return fragment;
    }  
}

After user click on an item of MusicGenreFragment, HomeTabsFragment is replaced by MusicGenreDetailFragment, which consists an adapter initialized in it:

MusicGenreDetailAdapter adapter = new   MusicGenreDetailAdapter(getChildFragmentManager(), genre);

This is the MusicGenreDetailAdapter:

public class MusicGenreDetailAdapter extends FragmentStatePagerAdapter {
    private static final int NUMBER_OF_FRAGMENTS = 2;
    public static final String[] mFragmentTitles = {"Artists", "Songs"};
    private MMusicGenre mGenre;
    public MusicGenreDetailAdapter(FragmentManager fm, MMusicGenre genre) {
        super(fm);
        mGenre = genre;
    }
    @Override
    public Fragment getItem(int position) {
        Fragment fragment = null;
        switch (position) {
            case 0:
                fragment = new ArtistFragment();
           ((ArtistFragment)fragment).setChannelId(mGenre.getChannelId());
                break;
            case 1:
                fragment = new PopularVideoFragment();
            ((PopularVideoFragment)fragment).setChannelId(mGenre.getChannelId());
                break;
        }
        return fragment;
    }
    @Override
    public int getCount() {
        return NUMBER_OF_FRAGMENTS;
    }
    @Override
    public void restoreState(Parcelable state, ClassLoader loader) {
        super.restoreState(state, loader);
    }
}

I overrided the method restoreState(Parcelable state, ClassLoader loader) and the app crashes here after configuration changes. I tried debugging and I found that there's no active fragment in the fragment manager of this adapter. If i comment out all the statements in restoreState, the first adapter is shown.

Here is the logcat :

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.rudy.youtubeplayer/com.rudy.youtubeplayer.ui.activity.MainActivity}: java.lang.NullPointerException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2205)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2255)
        at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3760)
        at android.app.ActivityThread.access$900(ActivityThread.java:142)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1209)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5118)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:610)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.NullPointerException
        at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:587)
        at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:211)
        at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1318)
        at android.view.View.dispatchRestoreInstanceState(View.java:12872)
        at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2652)
        at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2658)
        at android.view.View.restoreHierarchyState(View.java:12850)
        at android.support.v4.app.Fragment.restoreViewState(Fragment.java:466)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:981)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1120)
        at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1929)
        at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:547)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171)
        at android.app.Activity.performStart(Activity.java:5285)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2178)

             ....

Anybody can help me to solve this ?

0 Answers0