onPageSelected随机调用?

时间:2016-10-27 17:13:58

标签: android nullpointerexception android-viewpager android-pageradapter fragmentstatepageradapter

我目前正在开发一个使用带有ViewPager的TabLayout的应用程序,并且存在以下问题:有时,在没有任何可识别模式的情况下,会调用onPageSelected(int position)。这是一个问题,因为应用程序在移动到新部分时会保存上一部分,而保存意味着验证字段。因此,每当随机调用onPageSelected时,位置是第一个部分(0)的位置,并且该视图尚未创建,因此尝试验证EditTexts将导致NPE。

由于这个应用程序属于NDA,我会尽量给代码提供尽可能多的提示,而不会被解雇(:

该应用有一个主FragmentActivity来处理ViewPageronPageSelected方法。 每个部分都是一个片段(v4支持库),并使用Fragment page = (Fragment) viewPager.getAdapter().instantiateItem(viewPager, savedFragmentPosition)在onPageSelected方法中实例化。

ViewPager有自定义FragmentStatePagerAdapter,基本上会调用SectionNFragment fragment = new SectionNFragment(),其中N是位置+1。

但是,经过一段随机的时间后,再次调用onPageSelected,应用程序崩溃了。每当发生这种情况时,ViewPager会尝试显示第一个片段Section1Fragment,然后返回当前显示的片段。 这意味着该位置从N变为0,然后返回N,但在中间崩溃,因为它尝试保存Section1Fragment

我的团队和我已经尝试复制这个错误,但在试图找到模式2周后,我们得出结论是随机的。 我们尝试过:

  • 在FragmentStatePagerAdapter和FragmentPagerAdapter之间交替。
  • 仅在片段不为空且可见时保存,但这会带来另一个问题,即我们使用的主要对象由于某种原因变为空。这只是一种解决方法,而不是解决方案本身。
  • 将每个部分片段保存在Fragment的onDestroy中,但这会带来可用性问题,因为最后几节必须手动保存(由于ViewPager&#39,它们不会被销毁) ; s setOffscreenPageLimit最小为1,因此将保留在内存中。

还有其他人遇到过这个问题吗?我为这个含糊不清而道歉,但StackOverflow是我的最后一招。

提前致谢,任何形式的见解都会有所帮助!

编辑1

我决定在FragmentActivity中添加一些与viewPager创建相关的代码(称为FormActivity)&on;创建:

viewPager = (ViewPager) findViewById(R.id.viewpager);
    viewPager.setAdapter(new FormFragmentPagerAdapter(getSupportFragmentManager(),
            FormActivity.this));
    viewPager.addOnPageChangeListener(this);
    // Give the TabLayout the ViewPager
    tabLayout = (TabLayout) findViewById(R.id.sliding_tabs);
    tabLayout.setupWithViewPager(viewPager);

编辑2

我想澄清这个错误不是特定于设备的事实。我试过这个应用程序,这个错误发生在两个不同的设备上,有两个不同版本的Android:一个2012 Nexus 7运行5.1.1,一个华为MediaPad T1 8.0 Pro运行4.4.2。

0 个答案:

没有答案