Android:旋转后ViewPager屏幕错误

时间:2014-11-03 21:35:47

标签: android android-fragments rotation swipe

我真的很奇怪。 在我的活动中我有ViewPager,因为我想显示不同的屏幕。 每个屏幕都必须显示自己的字符串。 我的想法是创建一个活动,一个ViewPager和一个片段,其中包含有关必须显示哪个String的逻辑和信息。

这是我的活动:

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 个答案:

答案 0 :(得分:0)

好的,我买了我的自己。 添加

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

但没有super.onSaveInstanceState(outState);否则它会保存View的状态,而不是从头开始重新创建它们。