J'ai des fragments échangés dans et hors de mon activité principale. Le fragment initial est appelé BrowseHomeFragment et des charges bien au début, mais quand je le remplace par un nouveau fragment, puis le remplacer en arrière, je reçois l'erreur suivanteFragment ViewPager NullPointer question
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference
at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:686)
at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:215)
at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:536)
onCreateView Méthode de BrowseHomeFragment:
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
InjectionGraph.inject(this);
View view = inflater.inflate(R.layout.fragment_browse, container, false);
ButterKnife.inject(this, view);
addTabsToPagerSlidingTabStrip(inflater);
viewPager.setAdapter(new BrowseHomePagerAdapter(getChildFragmentManager()));
pagerSlidingTabStrip.setViewPager(viewPager);
// has to set page change listener in indicator
pagerSlidingTabStrip.setOnPageChangeListener(pageChangeListener);
viewPager.setCurrentItem(initialTabIndex);
return view;
}
BrowseHomePagerAdapter
public class BrowseHomePagerAdapter extends FragmentStatePagerAdapter {
private int lastPosition = -1;
@Inject
BrowseHomepageMetricRecorder browseHomepageMetricRecorder;
@Inject
NetworkMonitor networkMonitor;
/**
* For explanation on why Fragment references are cached, please refer to
* http://stackoverflow.com/questions/8785221/retrieve-a-fragment-from-a-viewpager
*/
final SparseArray<Fragment> registeredFragments = new SparseArray<>();
public BrowseHomePagerAdapter(FragmentManager fm) {
super(fm);
InjectionGraph.inject(this);
}
@Override
public Fragment getItem(int i) {
switch (BrowseHomeFragment.Tab.resolve(i)) {
// TODO: connect category, favorite, and downloaded list fragments
case Categories:
return new CategoryHomePageFragment();
case Downloaded:
return new OfflineContentFragment();
default:
return new ComingSoonFragment();
}
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
@Override
public int getCount() {
return BrowseHomeFragment.Tab.values().length;
}
@Override
public CharSequence getPageTitle(int position) {
return BrowseHomeFragment.Tab.resolve(position).name();
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
if (position != lastPosition) { // debounce Android's redundant calls
switch (BrowseHomeFragment.Tab.resolve(position)) {
case Categories:
browseHomepageMetricRecorder.recordGotoCategoriesMetric();
if (!networkMonitor.isDeviceConnected()) {
networkMonitor.postUserActionRequiresConnectivityEvent();
}
break;
case Downloaded:
browseHomepageMetricRecorder.recordGotoDownloadedMetric();
break;
default:
break;
}
lastPosition = position;
}
super.setPrimaryItem(container, position, object);
}
public Object instantiateItem(ViewGroup container, int position) {
final Fragment fragment = (Fragment) super.instantiateItem(container, position);
registeredFragments.put(position, fragment);
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
registeredFragments.remove(position);
super.destroyItem(container, position, object);
}
public Fragment getRegisteredFragment(int position) {
return registeredFragments.get(position);
}
Je comprends que le viewPager perd quelque chose même si j'ai lancé le déboguage et qu'il n'est pas nul ..
Je peux corriger cela en recréant simplement mon BrowseFragment chaque fois avant de remplacer le fragment actif, mais je préfère juste être capable de le réutiliser.
Toute aide pour comprendre ce qui se passe exactement et comment le résoudre serait grandement appréciée.
s'il vous plaît modifier votre question et ajouter le code manquant pour 'BrowseHomePagerAdapter' – petey
ouais désolé était en train de faire cela .. hâte rend la taille – erik