Android-app stürzt nach einer Weile durch die Verwendung von Fragmenten und ViewPager
Ich hab ein problem mit meiner android-app stürzt beim wiederherstellen meiner Fragmente. Ich habe noch keine benutzerdefinierte Variablen zu bündeln, die ich bin versucht, wiederherstellen, Es ist alles Standard. Ich bin mit Fragmenten und ViewPager. Siehe mein code-Schnipsel unten:
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);
}
}
Erhalte ich diese 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)
Als ich verstanden habe, dies kann ein bekanntes problem mit dem support-package-und, dass eine mögliche Lösung wäre die Verwendung setUserVisibleHint(true) in onSaveInstanceState. Aber das hat nicht geholfen.
Weiß jemand eine andere Lösung für das problem oder was hab ich falsch gemacht?
- hi @xteci haben Sie dieses Problem lösen ? Ich Fehler auch so, und kann immer noch nicht die Lösung finden
- ich auch, habt Ihr nichts gefunden? @hakim
- Sie können diese Antwort bei mir klappt es stackoverflow.com/questions/18642890/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe konfrontiert, die gleiche Art von Problem, sobald ich anfing mit ViewPager mit FragmentStatePagerAdapter innen Tab.
Dann spielte ich mit allen Foren zu diesem Thema und brechen meinen Kopf für zwei Tage, um herauszufinden, warum dieses Problem aufgetreten ist und wie Sie es beheben, aber nicht gefunden keine perfekte Lösung, erfüllt nach meiner Anforderung.
Bekam ich die Lösung, als um zu vermeiden, dass die NPE Absturz verwenden FragmentPagerAdapter statt FragmentStatePagerAdapter. Wenn ich ersetzen FragmentPagerAdapter statt FragmentStatePagerAdapter dann nicht vor NPE-crash-Problem, sondern die gleiche Seite wird nicht aktualisiert, selbst für die weitere navigation(das ist meine Anforderung).
Schließlich überschreiben die Methode saveState auf FragmentStatePagerAdapter und alles funktioniert wie erwartet, in Ordnung.
Wie ich das reproduzieren diese Frage leicht :
Ich bin mit der höheren version(4.1) Gerät und befolgt die folgenden Schritte aus:
1. Gehen Sie zu Einstellungen -> Entwickler-Optionen.
2. Klicken Sie auf die option "Do not keep activities".
Nun spielte ich mit meiner app.
Vor dem überschreiben die saveState () - Methode jedes mal, wenn die app abstürzt, wegen der NPE bei android.Unterstützung.v4.app.FragmentManagerImpl.getFragment(Quelle Unbekannt). Aber nach dem überschreiben saveState() kein Absturz registriert ist.
Ich hoffe, damit werden Sie nicht ein Problem.
Verwendete ich zunächst vorgeschlagene Lösung von @Lalit Kumar Sahoo. Allerdings, bemerkte ich ein ernsthaftes Problem: jedes mal, wenn ich drehte das Gerät, der Fragment-Manager Hinzugefügt, neue Fragmente, die ohne entfernen der alten. Also habe ich weiter gesucht und ich fand einen bug-report mit workaround-Vorschlag (Beitrag #1). Ich habe diesen fix getestet und mit meiner app, das Problem scheint aufgelöst werden, ohne jegliche Nebenwirkungen:
Warum genau machst du:
Diese:
Instanziiert das fragment.
Können Sie Daten laden, wie dies in dem fragment :