我目前正在开发一个使用带有ViewPager的TabLayout的应用程序,并且存在以下问题:有时,在没有任何可识别模式的情况下,会调用onPageSelected(int position)。这是一个问题,因为应用程序在移动到新部分时会保存上一部分,而保存意味着验证字段。因此,每当随机调用onPageSelected时,位置是第一个部分(0)的位置,并且该视图尚未创建,因此尝试验证EditTexts将导致NPE。
由于这个应用程序属于NDA,我会尽量给代码提供尽可能多的提示,而不会被解雇(:
该应用有一个主FragmentActivity
来处理ViewPager
和onPageSelected
方法。
每个部分都是一个片段(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周后,我们得出结论是随机的。 我们尝试过:
setOffscreenPageLimit
最小为1,因此将保留在内存中。还有其他人遇到过这个问题吗?我为这个含糊不清而道歉,但StackOverflow是我的最后一招。
提前致谢,任何形式的见解都会有所帮助!
我决定在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);
我想澄清这个错误不是特定于设备的事实。我试过这个应用程序,这个错误发生在两个不同的设备上,有两个不同版本的Android:一个2012 Nexus 7运行5.1.1,一个华为MediaPad T1 8.0 Pro运行4.4.2。