17

Meine Anwendung wird geschlossen, wenn ich meinen Bildschirm ausschalte und wieder einschalte.ViewPager PagerObserver wurde nicht registriert

Logcat teilt mir mit, dass die Ursache dieses Fehlers auf Java-Zeile 60 in meiner CourseFragment.class verweist, die Fragment erweitert.

mViewPager.setAdapter(infoTechPageAdapter); 

Ich implementiere einen ViewPager in meiner CourseFragment.class, die Fragment erweitert.

Hier ist mein 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 [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) 
+7

1. Ist der 'ViewPager' im Layout' R.layout.activity_drawer_fragment' deklariert? Wenn ja, dann benutze 'getActivity(). FindViewById (R.id.pagerYear);' um es zu finden, benutze stattdessen die Ansicht des Fragments direkt: 'getView(). FindViewById (R.id.pagerYear); '2. Wenn der' ViewPager' im 'CourseFragment' verwendet wird, übergeben Sie 'getChildFragmentManager()' anstelle von 'getActivity() an den' InfoTechPageAdapter' (und den Rest der Adapter). GetSupportFragmentManager() '. – Luksprog

+0

Ich bin beeindruckt. Du bist sehr [email protected] _ @ Ich habe ein anderes Problem, aber ich werde es wahrscheinlich später veröffentlichen, wenn ich keine Lösung finden kann, hoffe, Sie können mir auch dabei helfen. Ich danke dir sehr. – Marss

+0

Wirklich ... ich weiß nicht, wie ich danke sagen soll .... du bist wirklich gut, ich wusste noch nicht, wie ich deinen Kommentar finde ... Bitte gib den Kommentar als Antwort :) so dass jeder sehen kann sie schnell ... ich denke, niemand hat diese Lösung platziert .. –

Antwort

43

Wie @Luksprog in einem Kommentar darauf hingewiesen, müssen Sie

getActivity().getSupportFragmentManager() 

für

getChildFragmentManager() 
ändern

Warum: getSupportFragmentManager() (und getFragmentManager()) wird verwendet, um mit Fragmenten zu interagieren, die mit der Aktivität dieses Fragments verknüpft sind. Dies ist nicht das, was Sie wollen.

Was Sie wollen, ist das Platzieren und Verwalten von Fragmenten innerhalb dieses Fragments (mit Ihren Adaptern), das ist die Beschreibung der getChildFragmentManager() Methode.

Ein großes Dankeschön an @Luksprog für den Zeiger; Ich hatte das gleiche Problem wie du, und er hatte die Antwort! Einfach seine Antwort in einer echten Antwort posten, für andere, die vielleicht nicht daran denken, in den Kommentaren nach einer Antwort auf dieses Problem zu suchen.

+0

Was soll ich tun, wenn ich GetChildFragmentManager() auf Android 4.0 und 4.1 nicht habe? –

+1

@ RomulusUrakagiTs'ai: Diese Methode ist auch verfügbar von der [Support-Bibliothek] (http://developer.android.com/reference/android/support/v4/app/Fragment.html#getChildFragmentManager()), die Sie sollten Verwenden Sie immer, wenn Sie ältere Android-Versionen unterstützen möchten. –

+0

Viele Leute haben wahrscheinlich darauf getreten, da das Beispiel ['ViewPager'] (http://developer.android.com/reference/android/support/v4/view/ViewPager.html) einfach 'super' (activity.getFragmentManager ()); 'at ctor ... :( – Diederik

3

Ich hatte dieses Problem, obwohl ich 100% war sicher, dass ich die richtige FragmentManager verwendet habe. Ich löste es, indem ich eine Nullprüfung durchführte, als ich die ViewPager's adapter initialisierte.

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

Nach dem Studium Stacktrace Ich denke das Problem ist, dass ViewPager versucht, die alten gecached Fragmente zu zerstören, wenn die alten Adapter lösen und etwas schief läuft, weil die Fragmente nie wirklich sichtbar waren. Das ist nur eine Vermutung.

0

Ich hatte dieses Problem mit dem Android Studio generierten Code und verwendet die oben genannten Arbeiten mit der page.getAdapter() == null Prüfung, bevor Sie es jedes Mal erstellen onStart().

Schlusscode:

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

Nur Problem, das ich jetzt habe, ist, dass die Zurück-Taste drücken muss zweimal durchgeführt werden, damit sie funktionieren. Nicht sicher, ob dies ein Intent- oder Fragment-Problem ist ...

Verwandte Themen