with viewpager studio showing pagetransformer pageradapter not fragments example android android-fragments android-viewpager android-pageradapter android-navigation

android - viewpager - view pageradapter example



ViewPager PagerObserver no fue registrado (3)

Mi aplicación se cierra cuando apago la pantalla y la vuelvo a encender.

Logcat me dice que la causa de este error es apuntar a la línea 60 de Java en mi CourseFragment.class que extiende Fragmento.

mViewPager.setAdapter(infoTechPageAdapter);

Estoy implementando un ViewPager en mi CourseFragment.class que extiende Fragmento.

Aquí está mi código:

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)


Como lo señaló @Luksprog en un comentario, debe cambiar

getActivity().getSupportFragmentManager()

para

getChildFragmentManager()

Por qué: getSupportFragmentManager() (y getFragmentManager() ) se utiliza para interactuar con fragmentos asociados con la actividad de este fragmento, que no es lo que desea.

Lo que desea es colocar y administrar los Fragmentos dentro de este Fragmento (usando sus adaptadores), que es la descripción del método getChildFragmentManager() .

Muchas gracias a @Luksprog por el puntero; Tuve el mismo problema que tú, ¡y él tenía la respuesta! Solo publicando su respuesta en una respuesta real, para quienes no piensen en buscar en los comentarios una respuesta a este problema.


Estaba teniendo este problema a pesar de que estaba 100% seguro de que estaba usando el FragmentManager correcto. Lo resolví haciendo una comprobación nula al inicializar el ViewPager''s adapter .

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

Después de estudiar el seguimiento de pila, creo que el problema es que ViewPager está intentando destruir los viejos fragmentos en caché al liberar el adaptador antiguo y algo está mal porque los fragmentos nunca fueron visibles. Esto es solo una conjetura sin embargo


Tuve este problema con el código generado por Android Studio y utilicé el trabajo anterior con la page.getAdapter() == null comprobación page.getAdapter() == null antes de crearlo cada vez que onStart() .

Código final:

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

El único problema que tengo ahora es que presionar el botón Atrás debe hacerse dos veces para que funcione correctamente. No estoy seguro de si se trata de un problema de Intención o Fragmento ...