我使用PagerAdapter
在Android中创建了网页。当我试图从EditText获取第三页中的值时,我得到了NullPointerException
。
在第三个片段页面中,我已经初始化了EditText。
iName = (EditText) view.findViewById(R.id.name);
当第三页没有初始化时会出现这个问题吗?
答案 0 :(得分:3)
默认情况下,ViewPager
会在内存中保留一个片段。您可以通过设置屏幕外页面限制来更改此设置。
设置应保留在页面两侧的页数 处于空闲状态的视图层次结构中的当前页面。页面超出此范围 在需要时,将从适配器重新创建限制。
这是作为优化提供的。如果您事先知道这个号码 您将需要支持或具有延迟加载机制的页面 放在你的页面上,调整这个设置可以带来好处 感知到的分页动画和交互的平滑性。如果你有 少量页面(3-4),您可以一次保持活动状态, 在新创建的视图子树的布局中花费的时间会减少 用户来回翻页。
您应该保持此限制,特别是如果您的网页很复杂 布局。此设置默认为1.
参数限制空闲时屏幕外保留的页数 状态。
使用示例:yourViewPager.setOffscreenPageLimit(2);
答案 1 :(得分:0)
当你使用setOffscreenPageLimit()的默认实现时,它只加载它右边的一个片段。例如。当你在索引1上时,它在内存中加载索引2但不在索引0中加载,因此向左滑动必须从头开始生成一个新片段。要测试此理论,您可能需要使用setOffscreenPageLimit(2),然后尝试滑动索引1-> 0。这绝不是最佳解决方案,但有助于消除您对该概念的疑虑。
答案 2 :(得分:0)
你可以将这些页面中的所有页面的片段状态存储起来,并且可以参考它。
<强> PagerAdapter
强>
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
private List<Fragment> fragmentsList;
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Fragment fragment=new ScreenSlidePageFragment();
fragmentsList.add(fragment, position);
return fragment;
}
@Override
public int getCount() {
return NUM_PAGES;
}
public static List<Fragment> getFragmentsList(){
return fragmentsList;
}
}
活动:
List<Fragment> fragList=adapter.getFragmentsList()
View view = fragList.get(position).getView();
if (view !=null) {
view.findViewById(R.id.text_view).setText("Child Accessed :D");
}