2017-02-12 8 views
8

W moim MainActivity, mam:Fragment nie dodał (niespójne zderzeniowych)

@Override 
protected void onResume() { 
    super.onResume(); 

    checkForCrashes(); 
    checkForTutorial(); 
    checkForUpdates(); 
    setStore(); 
    setup(); 
} 

W setup() wzywam initializeTabs() w zwrotnego:

protected void setup() { 
    final Store s = getStore(); 
    setBackground(); 

    if (s == null) { 
     unauthorizedHandler(); 
     return; 
    } 
    final Context mainActivity = this; 
    fragments = getTabFragments(); 

    StoresController.getStoreDetails(s, mainActivity, new Callback<StoreDetailDecorator>() { 
     @Override 
     public void success(StoreDetailDecorator storeDetailDecorator, Response response) { 
      s.prettyName = storeDetailDecorator.store.pretty_name; 
      s.save(); 
      Log.v(TAG, s.prettyName); 
      TextView toolbar_label = (TextView)findViewById(R.id.toolbar_label); 
      toolbar_label.setText(MainActivity.getTruncatedMenuName(s.name())); 

      SummaryTab t1 = (SummaryTab)fragments.get(0); 
      t1.notifier = (SummaryTabLoadingNotifier)mainActivity; 
      initializeTabs(s, fragments); 
      t1.populateReport(); 
     } 
    } 
} 

public void initializeTabs(Store s, List<Fragment> fragments) { 
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager(), getTabTitles(), fragments); 
    ViewPager pager = (ViewPager) findViewById(R.id.pager); 
    pager.setOffscreenPageLimit(2); 
    pager.setAdapter(adapter); 
} 

Ta ostatnia linia jest upaść dla niektórych klientów.

java.lang.IllegalStateException: Fragment InfoTab{1bcb80f} is not currently in the FragmentManager 

Ale nie za każdym razem. Dlaczego czasem tak się dzieje? Coś związanego z tym, że fragment nie jest połączony? Czytałem pewne rzeczy o sprawdzaniu isAdded() na fragmencie, ale jest to sprawdzanie, czy fragment został dodany do działania. Używam FragmentStatePagerAdapter:

public class ViewPagerAdapter extends FragmentStatePagerAdapter { 
    private CharSequence[] titles; 
    private List<Fragment> fragmentList = new ArrayList<>(); 

    public ViewPagerAdapter(FragmentManager fragmentManager, CharSequence titles[], List<Fragment> fragmentList) { 
     super(fragmentManager); 
     this.titles = titles; 
     this.fragmentList = fragmentList; 
    } 

    @Override 
    public android.support.v4.app.Fragment getItem(int position) { 
     return fragmentList.get(position); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { return titles[position]; } 

    @Override 
    public int getCount() { return fragmentList.size(); } 

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

Czy saveState(){ return null;} być to? To jest, jak rozumiem, aby zapewnić, że widok jest odświeżany za każdym razem.

+0

Podobna do pytania odpowiedź jest prosta i przejrzysta tutaj> http://stackoverflow.com/a/11296700/5188159 –

Odpowiedz

4

onResume() jest wywoływana za każdym razem, gdy aktywność powraca na pierwszy plan.

Jeśli na przykład jeden z użytkowników naciśnie przycisk home i powróci do swojej aplikacji, ponownie zostanie wywołana getStoreDetails(), a po nadejściu zostanie utworzona nowa karta (z tą samą starą listą fragmentów).

Należy utworzyć kopie zapasowe swoich fragmentów, utworzyć adapter i zapełnić adapter tylko jeden raz().

Po otrzymaniu nowych danych od getStoreDetails() wystarczy zaktualizować już dodane fragmenty z nowymi danymi.

1

To dlatego, że wracasz null w saveState(). Nie należy próbować zastępować tego zachowania. Ale nawet jeśli chcesz to zrobić z jakiegoś powodu, musisz również przesłonić public void restoreState(Parcelable state, ClassLoader loader), aby uniknąć awarii, ponieważ ta metoda polega na danych zapisanych w saveState().

Ale proponuję, abyś w ogóle tego nie zmienił, a zamiast tego wyjaśnij, co chcesz osiągnąć.