2017-02-12 1 views
8

を追加し、私は持っていない:setup()は、フラグメント(矛盾クラッシュ)私の<code>MainActivity</code>で

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

    checkForCrashes(); 
    checkForTutorial(); 
    checkForUpdates(); 
    setStore(); 
    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()アクティビティがフォアグラウンドに戻るたびに呼び出されます。

たとえば、ホームボタンを押してアプリケーションに戻ると、getStoreDetails()が再度呼び出され、結果が到着したときに新しいアダプタ(同じ古いフラグメントリストを持つ)が作成されます。

フラグメントをインスタンス化してアダプタを作成し、viewpagerにアダプタを1回だけ挿入してください(onCreate()がその場所になります)。

getStoreDetails()から新しいデータが到着すると、既に追加されたフラグメントが新しいデータで更新されます。

1

nullsaveState()に返すためです。この動作をオーバーライドしないでください。 何らかの理由でそれをやりたいのであれば、public void restoreState(Parcelable state, ClassLoader loader)をオーバーライドする必要があります。その方法はsaveState()に保存されたデータに依存しているため、クラッシュすることはありません。

しかし、私はあなたにそれを上書きしないで、そこで達成したいことを説明することをお勧めします。