2016-08-10 7 views
1

FragmentStatePagerAdapter를 사용하여 ViewPager를 구현하고 있습니다. 코드 샘플은 다음과 같습니다. 다음과 같이방향 변경시 조각보기에 액세스

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { 

    public ScreenSlidePagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 

     Log.d("--GetItem", "---"); 

     switch (position) { 

      case 0: 
       return ScreenSlidePageFragment.newInstance(b1); 
      case 1: 
       return ScreenSlidePageFragment.newInstance(b2); 
      case 2: 
       return ScreenSlidePageFragment.newInstance(b3); 
      default: 
       return null; 
     } 

    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     Log.d("--InstItem", "--"); 
     return super.instantiateItem(container, position); 

    } 

    @Override 
    public int getCount() { 
     return NUM_PAGES; //set as 3 
    } 


} 

ScreenSlidePageFragment이다. MainActivity에서

public class ScreenSlidePageFragment extends Fragment implements View.OnClickListener{ 


    Bundle b; 

    public ScreenSlidePageFragment() { 

    } 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     Log.d("----onCreateFrgmnt--", "11"); 

     super.onCreate(savedInstanceState); 



    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     Log.d("----onCreateViewFrgmnt-", "11"); 

     ViewGroup rootView = (ViewGroup) inflater.inflate(
       R.layout.fragment_screen_slide_page, container, false); 

     return rootView; 

    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 

     super.onViewCreated(view, savedInstanceState); 

     Log.d("----onViewCreatedFrgmnt", "11"); 


     b = getArguments(); 

     TextView tv_city = (TextView) view.findViewById(R.id.city_field); 
     TextView tv_update = (TextView) view.findViewById(R.id.updated_field); 
     TextView tv_day = (TextView) view.findViewById(R.id.day); 

     tv_day.setText("DAY " + String.valueOf(b.getInt("day"))); 
     tv_city.setText(b.getString("city")); 

     tv_update.setText("Last update on : " + b.getString("date")); 

    } 

    @Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

    } 

    public static ScreenSlidePageFragment newInstance(Bundle myBundle) { 

     ScreenSlidePageFragment f = new ScreenSlidePageFragment(); 
     f.setArguments(myBundle); 
     return f; 
    } 
} 

, 나는 방향 변경을 처리하기 위해 노력하고 있습니다. 다음 코드를 사용합니다.

if (savedInstanceState != null) { 

    setContentView(R.layout.activity_main); 

    myViewPager = (MyCustomViewPager) findViewById(R.id.pager); 


    b1 = savedInstanceState.getBundle("Fragment1"); 
    b2 = savedInstanceState.getBundle("Fragment2"); 
    b3 = savedInstanceState.getBundle("Fragment3"); 



    myViewPager.setOffscreenPageLimit(NUM_PAGES - 1); 

    myPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); 

    myViewPager.setAdapter(myPagerAdapter); 

} 

조각들은 방향 변경시 재현됩니다. onCreateViewonViewCreated (Check LogCat)이 호출되고 있습니다. 문제는 조각에서 뷰를 업데이트하려고 할 때 발생합니다. 업데이트를 위해 나는 다음과 같은 코드를 사용하고 있습니다 :

FragmentStatePagerAdapter adapter = (FragmentStatePagerAdapter) myViewPager.getAdapter(); 

ScreenSlidePageFragment fragment1 = (ScreenSlidePageFragment) adapter.instantiateItem(myViewPager, 0); 
ScreenSlidePageFragment fragment2 = (ScreenSlidePageFragment) adapter.instantiateItem(myViewPager, 1); 
ScreenSlidePageFragment fragment3 = (ScreenSlidePageFragment) adapter.instantiateItem(myViewPager, 2); 

을하지만 fragment1.getView를 호출 할 때(), null을 반환합니다. 그러나 방향을 변경하지 않으면 동일한 코드가 잘 실행됩니다.

방향 변경시 조각보기를 어떻게 얻을 수 있습니까? 조각을 배열로 저장한다고 말한 일부 솔루션을 확인했지만 그 코드는 나를 위해 작동하지 않습니다. 내가 쓴 코드는 그 일을 할 수 없습니까? 고맙습니다.

답변

2

방향 변경시에만 발생하는 조각을 업데이트하지 않는 한 코드가 정상적으로 실행됩니다.

그러나보기가 아직 작성되지 않았으므로 업데이트 코드는 null (getView())으로 항상 반환됩니다. instantiateItem()을 호출하면 응용 프로그램에 아직 추가되지 않았으며 모든 수명주기 콜백 (onCreateView(...)onViewCreated(...) 포함)이 아직 호출되지 않은 상태에서 새 Fragment이 생성됩니다.

ViewPager의 조각을 올바르게 업데이트하는 복잡성 때문에 나는 우수 existing answer을 참조 할 것입니다. this question에서 자세한 내용을 확인할 수도 있습니다.