Android: неправильный экран ViewPager после поворота

У меня действительно странная проблема. В моей деятельности у меня есть ViewPager, потому что я хочу показать другой экран. Каждый экран должен показывать свою собственную строку. Моя идея состоит в том, чтобы создать одно действие, один ViewPager и один фрагмент, в который включена логика и информация о том, какая строка должна отображаться.

Это моя деятельность:

private PagerAdapter pagerAdapter;
private ViewPager mViewPager;

@Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);

 setContentView(R.layout.wizard_layout);

 pagerAdapter = new PagerAdapter(getFragmentManager());
 maxPages = pagerAdapter.getCount();

 // Set up the ViewPager with the sections adapter.
 mViewPager = (ViewPager) findViewById(R.id.pager);
 mViewPager.setAdapter(pagerAdapter); 

 mViewPager.setOnPageChangeListener(this);
 }

Это мой пейджер-адаптер

public class PagerAdapter extends FragmentPagerAdapter {
 public PagerAdapter(FragmentManager fm) {
 super(fm);
 }

 @Override
 public Fragment getItem(int position) {
 switch (position) {
 case 0:
 case 1:
 case 2:
 case 3:
 case 4:
 return StepWelcomeFragment.newInstance(position);
 }
 return null; 
 }

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

Это мой единственный фрагмент

public static class StepWelcomeFragment extends Fragment {
 private int sectionNumber;

 private static final String ARG_SECTION_NUMBER = "section_number";

 public static StepWelcomeFragment newInstance(int sectionNumber) {
 StepWelcomeFragment fragment = new StepWelcomeFragment();
 Bundle args = new Bundle();
 args.putInt(ARG_SECTION_NUMBER, sectionNumber);
 fragment.setArguments(args);
 fragment.sectionNumber = sectionNumber;
 return fragment;
 }

 public StepWelcomeFragment() {
 }

 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
 Bundle savedInstanceState) {
 View rootView = inflater.inflate(R.layout.wizard_welcome_step_layout,
 container, false);
 switch(sectionNumber){
 case 0: 
 showString0(); break;

 case 1:
 showString1(); break; 

 case 2:
 showString2(); break;

 case 3:
 showString3(); break;

 case 4:
 showString4(); break; 
 default: break;
 } 
 return rootView; 
 }
 }

Я использую переменную sectionNumber, чтобы сохранить (внутри самого фрагмента) информацию о том, какой экран имеет фокус.

Он работает нормально. Но, когда я поворачиваю устройство, активность уничтожается и воссоздается (как обычно), но то, что я вижу на экране, ВСЕГДА sting0. Не имеет значения, если я перейду к экрану экрана, на каждом новом экране (еще раз, только после его вращения) появится только String0. sectionNumber равно 0. Кроме того, даже без сохранения состояния, когда я поворачиваю, отображается текущий экран, мое ожидание - после поворота должен отображаться экран 0 (я ошибаюсь?). Кажется, что Activity не воссоздает новый адаптер и новый фрагмент. Что я делаю не так? Почему после ротации активность не убивается и не воссоздается должным образом? Я хочу сохранить данные, для меня это нормально уничтожать и перестраивать, но почему это не так? Большое спасибо

1 ответ

Хорошо, я купил себе. Достаточно добавить

@Override
 protected void onSaveInstanceState(Bundle outState) {
 /* Save which screen in visible */
 //super.onSaveInstanceState(outState);
 outState.putInt(currentViewTag, mViewPager.getCurrentItem());
 }

НО без super.onSaveInstanceState(outState); в противном случае он сохраняет состояние View вместо того, чтобы воссоздавать их с нуля.

licensed under cc by-sa 3.0 with attribution.