17

My application closes when i turn off my screen and turn it back on.

Logcat tells me that the cause of this error is pointing to java line 60 in my CourseFragment.class which extends Fragment.

mViewPager.setAdapter(infoTechPageAdapter);

I am implementing a ViewPager in my CourseFragment.class which extends Fragment.

Here's my code:

public class CourseFragment extends Fragment {

public static final String ARG_POSITION_NUMBER = "course_number";

private int position;

public CourseFragment() {
    // Empty constructor required for fragment subclasses
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView;
    position = getArguments().getInt("position");

    String course = getResources().getStringArray(
            R.array.array_navigation_drawer)[position];

    getActivity().setTitle(course);

    rootView = inflater.inflate(R.layout.activity_drawer_fragment,
            container, false);

    return rootView;
}// end onCreateView

@Override
public void onStart() {
    super.onStart();

    ViewPager mViewPager = (ViewPager) getActivity().findViewById(
            R.id.pagerYear);

    Log.i("posit", String.valueOf(position));
    switch (position) {

    case 0:
        InfoTechPageAdapter infoTechPageAdapter = new InfoTechPageAdapter(
                getActivity().getSupportFragmentManager());
        mViewPager.setAdapter(infoTechPageAdapter);
        break;

    case 1:
        ComSciPageAdapter comSciPageAdapter = new ComSciPageAdapter(
                getActivity().getSupportFragmentManager());
        mViewPager.setAdapter(comSciPageAdapter);
        break;

    case 2:
        ProfilePageAdapter profilePageAdapter = new ProfilePageAdapter(
                getActivity().getSupportFragmentManager());
        mViewPager.setAdapter(profilePageAdapter);
        break;
    }

}// end onStart
}

Logcat

09-22 10:54:03.830: E/AndroidRuntime(2917): FATAL EXCEPTION: main
09-22 10:54:03.830: E/AndroidRuntime(2917): java.lang.IllegalStateException: Observer android.support.v4.view.ViewPager$PagerObserver@4239b3e8 was not registered.
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.database.Observable.unregisterObserver(Observable.java:69)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.support.v4.view.PagerAdapter.unregisterDataSetObserver(PagerAdapter.java:294)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at com.usjr.sss.adapter.InfoTechPageAdapter.unregisterDataSetObserver(InfoTechPageAdapter.java:21)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:409)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at com.usjr.sss.fragment.CourseFragment.onStart(CourseFragment.java:60)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.support.v4.app.Fragment.performStart(Fragment.java:1502)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:957)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:415)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at com.usjr.sss.fragment.CourseFragment.onStart(CourseFragment.java:60)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.support.v4.app.Fragment.performStart(Fragment.java:1502)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:957)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.support.v4.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:1882)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:573)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1164)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.app.Activity.performStart(Activity.java:5114)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.app.Activity.performRestart(Activity.java:5169)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.app.ActivityThread.handleSleeping(ActivityThread.java:3408)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.app.ActivityThread.access$2700(ActivityThread.java:153)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1426)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.os.Looper.loop(Looper.java:137)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at android.app.ActivityThread.main(ActivityThread.java:5227)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at java.lang.reflect.Method.invokeNative(Native Method)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at java.lang.reflect.Method.invoke(Method.java:511)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
09-22 10:54:03.830: E/AndroidRuntime(2917):     at dalvik.system.NativeStart.main(Native Method)
Marss
  • 553
  • 7
  • 24
  • 7
    1. Is the `ViewPager` declared in the `R.layout.activity_drawer_fragment` layout? If yes, then don't use `getActivity().findViewById(R.id.pagerYear);` to find it, instead use the view of the fragment directly: `getView().findViewById(R.id.pagerYear);` 2. Again, If the `ViewPager` is set to be used in the `CourseFragment` then pass `getChildFragmentManager()` to the `InfoTechPageAdapter`(and the rest of the adapters) instead of `getActivity().getSupportFragmentManager()`. – user Sep 26 '13 at 09:10
  • I'm impressed. You're very good! @_@ I have another issue but I'll probably post it later if I can't find a solution, hope you can also help me with that. Thank you so much. – Marss Sep 26 '13 at 09:20
  • Really...I don't know how to say thanks.... you are really good still i didn't know how i find your comment...Please put the comment as answer :) so that every one can see them quickly...i think no one else placed this solution.. – Lijo John Oct 19 '13 at 04:01

3 Answers3

43

As pointed out by @Luksprog in a comment, you need to change

getActivity().getSupportFragmentManager()

for

getChildFragmentManager()

Why: getSupportFragmentManager() (and getFragmentManager()) is used to interact with fragments associated with this fragment's activity, which is not what you want.

What you want is to place and manage Fragments inside of this Fragment (using your adapters), which is the description of the getChildFragmentManager() method.

A big thanks to @Luksprog for the pointer; I had the same problem you did, and he had the answer! Just posting his answer in a real answer, for others who might not think to look in the comments for an answer to this issue.

Guillaume Boudreau
  • 2,231
  • 23
  • 25
  • What should I do if I don't have getChildFragmentManager() on Android 4.0 and 4.1? – Romulus Urakagi Ts'ai May 14 '14 at 01:58
  • 1
    @RomulusUrakagiTs'ai: This method is also available from the [support library](http://developer.android.com/reference/android/support/v4/app/Fragment.html#getChildFragmentManager()), which you should always use, if you intend to support older Android versions. – Guillaume Boudreau May 14 '14 at 10:17
  • Lots of people probably stepped on this as the example [`ViewPager`](http://developer.android.com/reference/android/support/v4/view/ViewPager.html) simply does `super(activity.getFragmentManager());` at ctor... :( – Diederik Jul 10 '14 at 13:34
  • 1
    Using Android 4.0+, it doesn't have `getChildFragmentManager()`. – Azurespot Mar 06 '15 at 04:22
  • @NoniA. See 2 comments above; you need the support library, if you want to support < 4.2 (when that method was added). – Guillaume Boudreau Mar 06 '15 at 11:39
3

I was having this problem even though I was 100% sure that I was using the correct FragmentManager. I solved it by doing a null check when initializing the ViewPager's adapter.

if(pager.getAdapter() == null)
    pager.setAdapter(pagerAdapter);

After studying the stacktrace I think the problem is that ViewPager is trying to destroy the old cached fragments when releasing the old adapter and something is going wrong because the fragments were never actually visible. This is just a guess though.

theblang
  • 9,669
  • 9
  • 61
  • 116
0

I had this problem using the Android Studio generated code and used the work above with the page.getAdapter() == null check before creating it each time onStart().

Final code:

@Override
public void onStart() {
    super.onStart();

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.pager);
    if(mViewPager.getAdapter() == null) {
        // Create the adapter that will return a fragment for each of the three
        // primary sections of the activity.
        mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager());
        mViewPager.setAdapter(mSectionsPagerAdapter);
    }
}

Only problem I have now is that pressing the back button needs to be done twice to work properly. Not sure if this is an Intent or Fragment issue...

Robert
  • 5,191
  • 43
  • 59
  • 113