Android - 使用 FragmentPagerAdapter 和旋转设备时的 NPE
Android - NPE when using FragmentPagerAdapter and rotating device
我正在尝试通过遵循 Google's sample todo app
来实现 MVP
架构
我遇到的问题是,在 fragments
的 onResume()
中启动 presenter
时,我得到了 NPE
。当我改变设备的方向时会发生这种情况。
我有一个 FragmentPagerAdapter
和两个静态 fragments
。
根据我的理解,FragmentPagerAdapter
意味着在屏幕旋转时保留 fragments
,这意味着 fragments
将保留其 presenters
。但是 presenters
在 onResume()
中为空,所以有些事情我不明白。
感谢任何help/comments。
编辑:
这是我当前的 FragmentPagerAdapter
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
FragmentA fragA = FragmentA.newInstance();
PresenterA presA = new PresenterA(fragA);
return fragA;
case 1:
FragmentB fragB = FragmentB.newInstance();
PresenterB presB = new PresenterB(fragB);
return fragB;
}
return null;
}
@Override
public int getCount() {
return 2;
}
}
老实说,Android中的片段实在是太麻烦了,Android发展了好几年,我至今都对它们感到沮丧。我用这样的东西,在这种情况下会有用:
public class MyAdapter extends FragmentStatePagerAdapter{
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int pos) {
switch(pos) {
case GlobalAppKeys.FRAGMENT_HOME:
return HomeFragment.newInstance(pos);
case GlobalAppKeys.FRAGMENT_NEXT:
return NextFragment.newInstance(pos);
default:
return new Fragment();
}
}
@Override
public int getCount() {
return 2;
}
@Override
public int getItemPosition(Object object) {
// refresh all fragments when data set changed
if (object instanceof HomeFragment){
HomeFragment hF = (HomeFragment) object;
if (hF != null) {
hF.updateThisFragment();
}
}
return super.getItemPosition(object);
}
}
所以事实证明,即使使用 FragmentPagerAdapter
,片段实际上在配置更改后被销毁(例如屏幕旋转),所以我最初的假设是错误的。我通过覆盖并在片段的 onDestroy
方法中添加打印语句发现了这一点。
在我的例子中,为了保留演示者,我只需要在片段的 onCreate
方法中 setRetainInstance(true)
。
我正在尝试通过遵循 Google's sample todo app
来实现MVP
架构
我遇到的问题是,在 fragments
的 onResume()
中启动 presenter
时,我得到了 NPE
。当我改变设备的方向时会发生这种情况。
我有一个 FragmentPagerAdapter
和两个静态 fragments
。
根据我的理解,FragmentPagerAdapter
意味着在屏幕旋转时保留 fragments
,这意味着 fragments
将保留其 presenters
。但是 presenters
在 onResume()
中为空,所以有些事情我不明白。
感谢任何help/comments。
编辑:
这是我当前的 FragmentPagerAdapter
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
FragmentA fragA = FragmentA.newInstance();
PresenterA presA = new PresenterA(fragA);
return fragA;
case 1:
FragmentB fragB = FragmentB.newInstance();
PresenterB presB = new PresenterB(fragB);
return fragB;
}
return null;
}
@Override
public int getCount() {
return 2;
}
}
老实说,Android中的片段实在是太麻烦了,Android发展了好几年,我至今都对它们感到沮丧。我用这样的东西,在这种情况下会有用:
public class MyAdapter extends FragmentStatePagerAdapter{
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int pos) {
switch(pos) {
case GlobalAppKeys.FRAGMENT_HOME:
return HomeFragment.newInstance(pos);
case GlobalAppKeys.FRAGMENT_NEXT:
return NextFragment.newInstance(pos);
default:
return new Fragment();
}
}
@Override
public int getCount() {
return 2;
}
@Override
public int getItemPosition(Object object) {
// refresh all fragments when data set changed
if (object instanceof HomeFragment){
HomeFragment hF = (HomeFragment) object;
if (hF != null) {
hF.updateThisFragment();
}
}
return super.getItemPosition(object);
}
}
所以事实证明,即使使用 FragmentPagerAdapter
,片段实际上在配置更改后被销毁(例如屏幕旋转),所以我最初的假设是错误的。我通过覆盖并在片段的 onDestroy
方法中添加打印语句发现了这一点。
在我的例子中,为了保留演示者,我只需要在片段的 onCreate
方法中 setRetainInstance(true)
。