为什么我的片段会在我的viewpager中重新初始化?

时间:2014-12-08 16:18:41

标签: java android android-fragments android-viewpager

我的viewpager有一个问题,其中包含3个碎片:当我向左移动时,右边的信息消失,当我向右移动时,左边的信息消失。 通过"信息"我的意思是我的项目中的textViews标签和数据。

此问题导致NullPointerExceptions。

我的代码:

public class Principal extends FragmentActivity {

private PagerAdapter mPagerAdapter;
private List<Fragment> fragments;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    super.setContentView(R.layout.principal);
    DataModel.getInstance().setFragmentActivity(this);

    // Création de la liste de Fragments que fera défiler le PagerAdapter
    fragments = new Vector<Fragment>();

    // Ajout des Fragments dans la liste
    fragments.add(Fragment.instantiate(this,PageGaucheFragment.class.getName()));
    fragments.add(Fragment.instantiate(this,PageMilieuFragment.class.getName()));
    fragments.add(Fragment.instantiate(this,PageDroiteFragment.class.getName()));

    // Création de l'adapter qui s'occupera de l'affichage de la liste de Fragments
    this.mPagerAdapter = new MyPagerAdapter(super.getSupportFragmentManager(), fragments);

    ViewPager pager = (ViewPager) super.findViewById(R.id.viewpager);
    // Affectation de l'adapter au ViewPager
    pager.setAdapter(this.mPagerAdapter);
    pager.setCurrentItem(1);

}
...



public class MyPagerAdapter extends FragmentPagerAdapter {

private final List<Fragment> fragments;

//On fournit à l'adapter la liste des fragments à afficher
public MyPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
    super(fm);
    this.fragments = fragments;
}

@Override
public Fragment getItem(int position) {
    return (Fragment) this.fragments.get(position);
}

@Override
public int getCount() {
    return this.fragments.size();
}

}

我的片段就是这样开始的:

public class PageGaucheFragment extends Fragment {

private TextView textViewIlluminePrecedent = null;

private View V;

private List<TextView> listeTextViewCombinaisons = new ArrayList<>();

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    V = inflater.inflate(R.layout.principal_page_gauche, container, false);
    ...

我找到了解决这个问题的方法,也许它是一个&#34;嵌套&#34;片段问题,但我不知道它是什么。

感谢您的帮助!

对不起我的英语,我是法国人;)

告诉我,如果我没有写足够的细节

1 个答案:

答案 0 :(得分:1)

默认情况下,ViewPager一次只在内存中当前页面两侧保留1个屏幕外页面。这意味着您在内存中最多有三页,如果您在第一个或最后一个项目上,则只有两个页面。

您可以通过在ViewPager上调用setOffscreenPageLimit(int)来调整此项。

但是,你应该小心谨慎,因为这会对内存造成严重影响,特别是在处理碎片时。

听起来真正的问题是你的片段没有正确地重新创建。如果在ViewPager重新创建碎片时遇到NullPointerExceptions,您可能也会在其他情况下遇到它们。

我会花些时间研究导致这些NullPointerExceptions的原因,并尝试解决这些错误。当您更改ViewPager页面时,请特别注意何时调用Fragment的生命周期方法,这应该有助于阐明问题的根源。