Подтвердить что ты не робот

ViewPager PagerObserver не зарегистрирован

Мое приложение закрывается, когда я выключаю свой экран и снова включаю его.

Logcat сообщает мне, что причина этой ошибки указывает на строку java 60 в моем CourseFragment.class, которая расширяет фрагмент.

mViewPager.setAdapter(infoTechPageAdapter);

Я внедряю ViewPager в свой CourseFragment.class, который расширяет фрагмент.

Здесь мой код:

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 [email protected] 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)
4b9b3361

Ответ 1

Как указано в комментарии @Luksprog, вам нужно изменить

getActivity().getSupportFragmentManager()

для

getChildFragmentManager()

Почему: getSupportFragmentManager()getFragmentManager()) используется для взаимодействия с фрагментами, связанными с этим действием фрагмента, что вам не нравится.

Вы хотите разместить и управлять фрагментами внутри этого фрагмента (используя ваши адаптеры), который является описанием метода getChildFragmentManager().

Большое спасибо @Luksprog за указатель; У меня была та же проблема, что и у вас, и у него был ответ! Просто отправьте свой ответ в реальном ответе, для других, которые, возможно, не подумают заглянуть в комментарии для ответа на этот вопрос.

Ответ 2

У меня была эта проблема, хотя я был 100% уверен, что использовал правильный FragmentManager. Я решил это, выполнив нулевую проверку при инициализации ViewPager adapter.

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

После изучения stacktrace я думаю, что проблема заключается в том, что ViewPager пытается уничтожить старые кешированные фрагменты при выпуске старого адаптера, и что-то не так, потому что фрагменты никогда не были видимыми. Это только предположение.

Ответ 3

У меня возникла эта проблема с использованием кода, сгенерированного Android Studio, и использовала выше описанную работу с тегом page.getAdapter() == null, прежде чем создавать его каждый раз onStart().

Конечный код:

@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);
    }
}

Единственная проблема, с которой я столкнулся, заключается в том, что нажатие кнопки "Назад" должно выполняться дважды, чтобы работать правильно. Не уверен, что это вопрос о намерении или фрагменте...