【发布时间】:2014-06-14 22:04:55
【问题描述】:
我有一个 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) {
}
});
...
}
例如第二个片段中的以下方法在屏幕旋转后调用时会引发 NPE:
public int getPersons() {
int persons = 0;
if (etPersons.length() > 0 ) {
persons = Integer.parseInt(etPersons.getText().toString());
}
return persons;
}
特别是if (etPersons.length() > 0 ) {这一行
【问题讨论】:
标签: android android-fragments android-viewpager android-lifecycle