2017-02-12 4 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을 어댑터로 한 번만 채우십시오 (onCreate()이 그 자리에 표시됨).

getStoreDetails()에서 새 데이터가 도착하면 이미 추가 된 부분을 새 데이터로 업데이트하면됩니다.

1

nullsaveState()에 반환했기 때문입니다. 이 동작을 무시하려고해서는 안됩니다. 비록 어떤 이유로 든 그것을하고 싶지 만, 그 방법은 saveState()에 저장된 데이터에 의존하기 때문에, 충돌을 피하기 위해 public void restoreState(Parcelable state, ClassLoader loader)을 오버라이드해야합니다.

그러나 나는 그것을 전혀 무시하지 말고 대신 거기에서 달성하기를 원하는 것을 설명하십시오.