我有一个标签活动。为了创建选项卡,我正在使用Fragments并使用以下适配器类:
class ViewPagerAdapter extends FragmentPagerAdapter
{
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
在托管标签的活动的oncreate函数中,我调用一个方法(见下文)来创建一些片段,将它们添加到ViewPagerAdapter的实例中,并将其设置为我的ViewPager UI元素的适配器。其中一个片段还有一些成员变量(字符串等)。我在使用setter在活动中创建片段时设置了这些。
以下是我在活动中所做的事情。 (为了清楚起见,剥掉了,删除了无关的片段。)
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
SummaryTabFragment frag1 = new SummaryTabFragment();
frag1.setUser(user);
adapter.addFragment(frag1, "Summary");
viewPager.setAdapter(adapter);
}
一切正常,除了屏幕旋转时。应用程序崩溃在onCreateView中具有对象变量的片段中,事实证明片段的每个成员都为null,因此我收到NullPointerException。这很奇怪,因为当旋转屏幕,然后重新创建活动时,我再次创建新的片段,设置成员变量,将它们添加到适配器并像以前一样设置viewPager。
我已经阅读了片段生命周期,但不明白为什么这不起作用,因为我只是在重新创建所有内容。
答案 0 :(得分:1)
我认为问题出在Fragment中,它有一些成员变量(字符串等)。 旋转时,框架将调用默认构造函数(没有参数),因此您将丢失输入数据 要保留它,您应该尝试实现onSaveInstanceState 这是示例
Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("key", value);
}
然后像这样保留它
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if(savedInstanceState!=null){
int id =savedInstanceState.getInt("key"); // get the value agains
}
...
}
注意:我建议您不要将Fragment构造函数与一些参数一起使用。您应该使用Frament的默认构造函数,然后将extras数据放入Fragment by Bundle
Fragment fragment = new Fragment();
Bundle bundle = new Bundle();
bundle.putInt(key, value);
fragment.setArguments(bundle);
然后在你的片段中,用:
检索数据(例如在onCreate()中) Bundle bundle = this.getArguments();
int myInt = bundle.getInt(key, defaultValue);
希望这个帮助