2017-02-12 151 views
8

在我MainActivity,我有:片段(不一致崩潰)

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

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

setup(),我叫initializeTabs()在回調中:

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

最後一行崩潰了一些客戶。

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

但不是每一次。爲什麼有時會發生這種情況與片段沒有連接的東西?我讀了一些關於在片段上檢查isAdded()的問題,但是這是爲了檢查片段是否添加到活動中。我使用的是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; 
    } 
} 

難道saveState(){ return null;}吧?據我所知,這是在那裏,以確保每次刷新視圖。

+0

類似於你的問題好的和明確的答案在這裏> http://stackoverflow.com/a/11296700/5188159 –

回答

4

onResume()每當您的活動返回到前臺時被調用。

例如,如果其中一個用戶按下home按鈕並返回到您的應用程序,則getStoreDetails()將再次被調用,並且當結果到達時您將創建一個新的適配器(具有相同的舊片段列表)。

你應該實例化你的碎片,創建一個適配器,並用適配器填充你的viewpager只需要一次(onCreate()就是現貨)。

當新數據從getStoreDetails()到達時,只需使用新數據更新已添加的片段即可。

1

這是因爲您要返回nullsaveState()。您不應該嘗試重寫此行爲。 但即使您因爲某些原因想要這樣做,您也必須覆蓋public void restoreState(Parcelable state, ClassLoader loader)以避免崩潰,因爲該方法依賴於保存在saveState()中的數據。

但我建議你不要重寫它,而是解釋你想達到的目標。