2013-09-04 3 views
0

일부 프래그먼트가있는 뷰 페이지가 있으며 조각의 UI를 편집해야하는 각 모델 클래스에 대해 각 프래그먼트를 설정합니다. 그 모델 클래스는 FragmentStatePagerAdapter에 그 조각을 추가하기 전에 생성자에서 조각을 설정했습니다. 내 문제는 화면을 회전하거나 시스템에서 응용 프로그램을 종료하고 복원 할 때 시스템에서 조각을 다시 만들고 모델 클래스 인스턴스가 손실된다는 것입니다. 새 FragmentStatePagerAdapter를 설정하더라도 시스템에서 만든 조각이 표시됩니다. 내가 조각의 새로운 인스턴스를 생성하여 뷰 페이지에 넣을 수있는 올바른 방법이 있습니까? 나는 FragmentManager에서 프래그먼트를 제거하고, viewpager에 Adapter를 다시 추가하고, FragmentPagerAdapter 만 FragmentStatePagerAdapter를 변경하고 아무 도움도주지 않을 것이라고 생각했다.뷰 페이지의 조각

일부 자원에서 로더에서로드 모델 클래스와 내 활동 클래스 :

public class WizardPagerAdapter extends FragmentPagerAdapter { 
private final List<Fragment> mFragments; 
private final int count; 

public WizardPagerAdapter(FragmentManager fm, List<Fragment> fragments) { 
    super(fm); 
    mFragments = fragments; 
    count = mFragments.size(); 
} 

@Override 
public Fragment getItem(int index) { 
    return mFragments.get(index); 
} 

@Override 
public int getCount() { 
    return count; 
} 
} 
+0

화면 방향 변경시 작업이 다시로드되고 있습니까? –

+0

Manifest 파일의 activity 요소에 screenSize를 추가 했습니까? 그것은 화면 회전에서 활동 레크 리 에이션을 방지합니다. 또한 조각 생성자에서 view가 null이 아닌지 확인해야합니다. –

+0

예, 작업이 다시로드되고 onCreateView 및 onResume과 같은 단편 라이프 사이클 메소드가 호출되어 로더가 완료됩니다. 나는 화일에 manifest 파일을 추가하려고하지 않는다. – Billda

답변

1

이 매니페스트 안드로이드에 추가하려고

 List<Fragment> visibleFragment = new ArrayList<Fragment>(); 
     for (Screen screen : wizard.screens) { 
      if (screen.visible) { 
       visibleFragment.add(new ScreenUI(screen)); 
      } 
     } 
     viewPager.setAdapter(null); 
     viewPager.setAdapter(new WizardPagerAdapter(getSupportFragmentManager(), visibleFragment)); 

내 FragmentStatePagerAdapter : configChanges = "오리엔테이션 | 화면 크기 | keyboardHidden"활동 . 그

public class ViewPagerTaskAdapter extends FragmentStatePagerAdapter { 
Map<Integer, FragmentViewTask> fragmentsTask = new HashMap<Integer, FragmentViewTask>(); 
@Override 
    public Fragment getItem(int arg0) { 
     FragmentViewTask myFragment = FragmentViewTask.newInstance(arg0, 
       tasks.get(arg0)); 
     fragmentsTask.put(arg0, myFragment); 
     return myFragment; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     super.destroyItem(container, position, object); 
     fragmentsTask.remove(position); 
    } 
     public FragmentViewTask getFragment(int key) { 
     return fragmentsTask.get(key); 
    } 

    @Override 
    public int getCount() { 
     if (tasks != null) 
      return tasks.size(); 

     return 0; 
    } 

} 
+0

시스템 설정 변경을 금지하는 일반적인 해결책이 아니다. – Billda

+0

물론 가능하다! 하지만 때로는 도움이되고 매우 유용합니다. –

0

같은

또는 뭔가 당신이 당신의 FragmentsonRetainInstance(true)를 사용하여 시도 적이 있습니까?

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true);  
} 
+0

네, 화면 방향을 변경할 때 문제를 해결할 수 있지만 시스템이 내 앱을 종료 할 때 문제는 아닙니다. – Billda

관련 문제