具有片段的FragmentPagerAdapter成员的Android Viewpager在轮换后变为空

时间:2015-11-12 01:19:00

标签: android android-fragments android-viewpager fragmentpageradapter

我有一个标签活动。为了创建选项卡,我正在使用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。

我已经阅读了片段生命周期,但不明白为什么这不起作用,因为我只是在重新创建所有内容。

1 个答案:

答案 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);

希望这个帮助