只有在viewpager中的两个片段中的第一个在屏幕旋转时正确地重新创建

时间:2014-06-14 22:04:56

标签: android android-fragments android-viewpager android-lifecycle

我有一个ViewPager,其中2个片段设置为可滑动的标签。一切正常,但是当我旋转屏幕时,只有第一个片段被正确地重新创建。在第二个中,一旦调用了处理第二个片段中的小部件的方法,我就会得到NullPointerException。我可以通过在第二个片段上设置setRetainInstance(true);来解决这个问题。但是系统不应该正确地重建这两个片段吗?

我的活动是:

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

    setContentView(R.layout.activity_main);

    if (savedInstanceState !=null ) {
        mPersons = savedInstanceState.getInt(STATE_PERSONS);
        mPercentage = savedInstanceState.getInt(STATE_TIP);
    }

    // setup ActionBar
    String[] mTabTitles = getResources().getStringArray(R.array.tabs);
    final ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    // setup TabsAdapter and ViewPager
    mTabsAdapter = new TabsAdapter(getFragmentManager());
    mViewPager = (ViewPager) findViewById(R.id.viewPager);
    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            actionBar.setSelectedNavigationItem(position);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });

    mViewPager.setAdapter(mTabsAdapter);

    for (String tab_name : mTabTitles) {
        actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this));
    }
...

我的TabsAdapter是:

public class TabsAdapter extends FragmentPagerAdapter {
    final int NUMBER_OF_TABS = 2;

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

    @Override
    public Fragment getItem(int index) {
        switch (index) {
            case 0:
                return new SharedBillFragment();
            case 1:
                return new SeparateBillFragment();
        }

        return null;
    }

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

在我的片段中,我在onActivityCreate()中初始化我的小部件,例如(我也尝试在onCreateView()中初始化它们,结果相同......:

private EditText etPersons;


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

    etPersons = (EditText) getActivity().findViewById(R.id.etPersonsS);
    etPersons.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
            if (etPersons.length() > 0) {
                mCallback.onPersonsSelected(Integer.parseInt(etPersons.getText().toString()));
            } else {
                mCallback.onPersonsSelected(0);
            }
        }

        @Override
        public void afterTextChanged(Editable editable) {

        }
    });
...
}

E.g。第二个片段中的以下方法在屏幕旋转后调用时抛出NPE:

public int getPersons() {
    int persons = 0;
    if (etPersons.length() > 0 ) {
        persons = Integer.parseInt(etPersons.getText().toString());
    }
    return persons;
}

特别是行if (etPersons.length() > 0 ) {

1 个答案:

答案 0 :(得分:0)

您应该使用FragmentStatePagerAdapter而不是FragmentPagerAdapter。仅在 FragmentStatePagerAdapter getItem()中调用,因此重新创建。