【问题标题】:Why my fragments are reinitialized in my viewpager?为什么我的片段在我的浏览器中重新初始化?
【发布时间】:2014-12-09 00:36:15
【问题描述】:

我的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);
    ...

我在寻找这个问题的解决方案,也许这是一个“嵌套”片段问题,但我不知道它是什么。

感谢您的帮助!

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

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

【问题讨论】:

    标签: java android android-fragments android-viewpager


    【解决方案1】:

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

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

    但是,您应该谨慎操作,因为这会对内存产生严重影响,尤其是在处理 Fragment 时。

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

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

    【讨论】:

    • ViewPager 不处理屏幕外页面的数量 - 这是您还必须提供的 PagerAdapter 的工作。在他的例子中,他提供了一个 FragmentPagerAdapter
    • @SamDozor setOffScreenPageLimit 是 ViewPager 上的一个方法。
    • 谢谢,setOffscreenPageLimt(int) 方法解决了我的问题!而我所拥有的 NullPointerExceptions 不是因为片段,而是因为我的项目的某些类使用片段来显示信息
    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    相关资源
    最近更新 更多