2013-02-18 5 views
0

뷰 뷰어로 구성된 응용 프로그램을 개발하고 있습니다. 뷰 페이저를 스 와이프하는 동안 올바르게로드 된 모든 조각이 있지만 여기에 문제가 있습니다. 다시 한 번 다시 같은 페이징을 사용하여보기 호출기를 스 와이프하면 다시로드됩니다.하지만 이전 요구 사항에 따라로드 된 조각이 복원되어야합니다. 다음 두 가지 코드로 시도했습니다.ViewPager가 스 와이프 중 이전 조각이 아닙니다

A)는 여기 내보기 호출기

어댑터에서
mViewPager = (ViewPager)mMyPageFragment.findViewById(R.id.Viewpager); 

     myAdapter = new MyAdapter(getFragmentManager()); 
     mViewPager.setAdapter(myAdapter); 
     myAdapter.notifyDataSetChanged(); 

,

public class MyAdapter extends FragmentStatePagerAdapter { 
    public MyAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public int getCount() { 
     return 3; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     System.out.println("MyAdapter="+position); 
     switch (position) { 
     case 0: 
      return new MyPageFirstFragment1(); 
     case 1: 
      return new MyPageFirstFragment2(); 
     case 2: 
      return new MyPageFirstFragment3(); 

     default: 
      return null; 
     } 
    } 
} 

두 번째 방법이다

private static Hashtable<Integer, Fragment> fragmentItems = new Hashtable<Integer, Fragment>(); 

    @Override 
    public Fragment getItem(int position) { 
     System.out.println("MyAdapter=" + position); 
     switch (position) { 
     case 0: { 
      if (!fragmentItems.containsKey(position)) { 
       fragmentItems.put(position, new MyPageFirstFragment1()); 
      } 
      return fragmentItems.get(position); 
     } 
     case 1: { 
      if (!fragmentItems.containsKey(position)) { 
       fragmentItems.put(position, new MyPageFirstFragment2()); 
      } 
      return fragmentItems.get(position); 
     } 
     case 2: { 
      if (!fragmentItems.containsKey(position)) { 
       fragmentItems.put(position, new MyPageFirstFragment3()); 
      } 
      return fragmentItems.get(position); 
     } 
     case 3: { 
      if (!fragmentItems.containsKey(position)) { 
       fragmentItems.put(position, new MyPageFirstFragment4()); 
      } 
      return fragmentItems.get(position); 
     } 

     default: 
      return null; 
     } 
    } 

이 내가 사용한 코드입니다,하지만 내가 할 수있는 파편을 유지하지 마라.

답변

1

조각 관리자는 장치 구성 변경 중에 조각에 대한 정보를 저장하고 그 후에 조각을 복원하지만 새로운 조각 개체로 복원하기 때문에 조각을 정적 개체에 저장하면 안됩니다. 그리고 "오래된"정적 객체가 무효화됩니다. `

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Log.i(LOG_TAG, "onCreate()"); 
     //setting view pager 
     mViewPager = (ViewPager) findViewById(R.id.mainActivity_viewPager); 


     //initializing activity 
     if(savedInstanceState == null) { 
      Log.i(LOG_TAG, "onCreate() - savedInstanceState == null"); 
      //activity first creation 
     } else { 
      Log.i(LOG_TAG, "onCreate(), savedInstanceState != null, it is activity start after device reconfiguration.. "); 


      //recreating viewpager adapter 
      mViewPager.setAdapter(recreateParentFragmentListAdapter()); 

     } 

예 위해 .. I 프래그먼트 활동에서 onCreate() 메소드 경우 savedInstanceState! = NULL 체크 선호하고 있는지 I가 태그 (findFragmentByTag)하여보기 호출기 프래그먼트를 복원하고 복원 된 단편에서 새 어댑터를 만들 및
`

private ParentFragmentListAdapter recreateParentFragmentListAdapter() { 
     List<BaseParentFragment> fragments = new ArrayList<BaseParentFragment>(3); 
     for(int id = 0; id < 3; id++) { 
      String fragmentTag = getFragmentTag(R.id.mainActivity_viewPager, id);//int -> long converting 
      BaseParentFragment fragment = (BaseParentFragment) (getSupportFragmentManager().findFragmentByTag(fragmentTag)); 

      Log.i(LOG_TAG, "onCreate() - finding fragment with tag {" + fragmentTag + "}, found fragment = " + (fragment == null ? "null" : fragment.toString())); 

      if(fragment == null){//creating it 
       switch(id) { 
       case 0: 
        fragment = new Tab1Fragment(); 
       case 1: 
        fragment = new Tab2Fragment(); 
       case 2: 
        fragment = new Tab3Fragment(); 
       } 
      } 
      fragments.add(fragment); 
     } 

     ParentFragmentListAdapter adapter = new ParentFragmentListAdapter(getSupportFragmentManager(), fragments); 
     return adapter; 
    } 

` 및

private String getFragmentTag(int viewId, long id) { 
     return "android:switcher:" + viewId + ":" + id; 
    } 

SDK에서