2012-06-19 16 views
7

Tengo un problema con la aplicación de Android al intentar restaurar mis fragmentos. No agregué ninguna variable personalizada al paquete que estoy tratando de restaurar. Es todo predeterminado. Estoy usando Fragments y ViewPager. Ver mis fragmentos de código a continuación:Aplicación para Android que se cuelga después de un tiempo con Fragments y ViewPager

public static class MyAdapter extends FragmentStatePagerAdapter { 
    public MyAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public int getCount() { 
     return NUM_ITEMS; 
    } 

    public int getCurrentItemPosition(Fragment fragment){ 
     return getItemPosition(fragment); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return ContentFragment.newInstance(position); 
    } 
} 

public class MyActivity extends FragmentActivity { 

static final int NUM_ITEMS = 100000; 
public int currentSelectedPage; 
private int changeToFragmentIndex; 
public DateTime midDate; 
MyAdapter mAdapter; 
ViewPager mPager; 

/** Called when the activity is first created. */ 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.diary); 
    MyApplication application = (MyApplication)getApplication(); 
    application.dataController.myActivity = this; 
    mAdapter = new MyAdapter(getSupportFragmentManager()); 
    mPager = (ViewPager)findViewById(R.id.pager); 
    mPager.setAdapter(mAdapter); 
    int newDay = application.daysBetween(DateTime.now(), DateTime.parse(application.day.dateToShortString())); 

    this.currentSelectedPage = NUM_ITEMS/2+newDay; 
    mPager.setCurrentItem(NUM_ITEMS/2+newDay); 
    mPager.setOnPageChangeListener(new SimpleOnPageChangeListener(){ 
     public void onPageSelected(int position){ 
      currentSelectedPage = position; 
      ContentFragment fragment = (ContentFragment) mAdapter.instantiateItem(mPager, currentSelectedPage); 
      fragment.loadData(); 
     } 
    }); 
} 

} 

public class ContentFragment extends Fragment { 
private View v; 
static final int NUM_ITEMS = 100000; 

static ContentFragment newInstance(int num) { 
    ContentFragment f = new ContentFragment(); 

    return f; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    if (container == null) 
     return null; 
    v = inflater.inflate(R.layout.diarycontent, container, false); 
    return v; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

} 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState){ 
    super.onSaveInstanceState(savedInstanceState); 
    setUserVisibleHint(true); 
} 
} 

recibo este stackstrace:

Caused by: java.lang.NullPointerException 
at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:519) 
at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:1 55) 
at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:522) 

lo que tengo entendido que esto puede ser un problema conocido con el paquete de soporte y que una posible solución sería utilizar setUserVisibleHint (cierto) en onSaveInstanceState. Pero eso no ayudó.

¿Alguien sabe otra solución al problema o lo que he hecho mal?

+0

hi @xteci has resolver este problema? También encuentro un error así y todavía no puedo encontrar la solución – hakim

+0

, ¿han encontrado algo? @hakim – henrikpersson

+0

Puede usar esta respuesta para mí http://stackoverflow.com/questions/18642890/fragmentstatepageradapter-with-childfragmentmanager-fragmentmanagerimpl-getfra –

Respuesta

-1

Por qué estás haciendo exactamente:

mPager.setOnPageChangeListener(new SimpleOnPageChangeListener(){ 
    public void onPageSelected(int position){ 
     currentSelectedPage = position; 
     ContentFragment fragment = (ContentFragment) mAdapter.instantiateItem(mPager, currentSelectedPage); 
     fragment.loadData(); 
    } 
}); 

Este:

@Override 
public Fragment getItem(int position) { 
    return ContentFragment.newInstance(position); 
} 

una instancia del fragmento.

Puede cargar datos de este tipo en el fragmento:

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
super.onActivityCreated(savedInstanceState); 
loadData(); 
} 
+0

Estaba haciendo eso porque tuve algunos problemas para actualizar mis fragmentos correctamente . Probé tu código y todavía se produce el bloqueo. – xteci

+0

¿fue capaz de resolver esto? Estoy atascado con este problema – Preethi

+0

Esto lo resolvió para mí, o lo ocultó realmente http://stackoverflow.com/questions/18642890/fragmentstatepageradapter-with-childfragmentmanager-fragmentmanagerimpl-getfra –

20

me he enfrentado mismo tipo de problema una vez que empecé a usar ViewPager con FragmentStatePagerAdapter dentro Tab.

Luego jugué con todos los foros relacionados con este problema y me rompí la cabeza durante dos días para descubrir por qué ocurrió este problema y cómo resolverlo, pero no encontré ninguna solución perfecta que cumpla con mis requisitos.

Recibí la solución ya que para evitar el bloqueo de NPE use FragmentPagerAdapter en lugar de FragmentStatePagerAdapter. Cuando reemplazo FragmentPagerAdapter en lugar de FragmentStatePagerAdapter, no tengo problemas de bloqueo de NPE, pero la misma página no se actualiza para una mayor navegación (que es mi requisito).

Finalmente reemplaza el método saveState en FragmentStatePagerAdapter y todo funciona bien como se esperaba.

@Override 
public Parcelable saveState() { 
    // Do Nothing 
    return null; 
} 


Cómo reproduzco este problema fácilmente:
estoy usando la versión más alta (4.1) del dispositivo y seguido los siguientes pasos:
1. Vaya a Configuración -> Opciones de desarrollador.
2. Haga clic en la opción "No guardar actividades".

Ahora jugué con mi aplicación.

Antes de anular el método saveState() cada vez que la aplicación se bloquea debido a la NPE en android.support.v4.app.FragmentManagerImpl.getFragment (origen desconocido). Pero después de anular saveState() no se registra ningún bloqueo.

Espero que al hacerlo no tenga ningún problema.

+0

¡Gracias Rly por esto! –

+4

¡Funciona! ¿Alguien sabe por qué? – Archit

+0

¡Muchísimas gracias! Funciona perfectamente –

0

Inicialmente utilicé la solución sugerida por @Lalit Kumar Sahoo.Sin embargo, noté un problema grave: cada vez que rotaba el dispositivo, , Fragment Manager agregaba nuevos fragmentos sin eliminar los anteriores. Así que busqué más y encontré un informe de error con una sugerencia de solución alternativa (post #1). He utilizado esta revisión y probado con mi aplicación, el problema parece estar resuelto sin ningún tipo de efectos secundarios:

Solución: Crear FragmentStatePagerAdapter costumbre en src/android/apoyo del proyecto de la carpeta/v4/aplicación y utilizarlo .

package android.support.v4.app; 

import android.os.Bundle; 
import android.view.ViewGroup; 

public abstract class FixedFragmentStatePagerAdapter extends FragmentStatePagerAdapter { 

    public FixedFragmentStatePagerAdapter(FragmentManager fm) { 
    super(fm); 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
    Fragment f = (Fragment)super.instantiateItem(container, position); 
    Bundle savedFragmentState = f.mSavedFragmentState; 
    if (savedFragmentState != null) { 
     savedFragmentState.setClassLoader(f.getClass().getClassLoader()); 
    } 
    return f; 
    } 
} 
+1

pero "mSavedFragmentState" no está disponible ... –

Cuestiones relacionadas