我有一个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 ) {
答案 0 :(得分:0)
您应该使用FragmentStatePagerAdapter而不是FragmentPagerAdapter。仅在 FragmentStatePagerAdapter getItem()
中调用,因此重新创建。