首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >随着时间的推移,ViewPager片段会被销毁吗?

随着时间的推移,ViewPager片段会被销毁吗?
EN

Stack Overflow用户
提问于 2012-03-25 10:20:43
回答 2查看 8.8K关注 0票数 17

我正在使用安卓的support.v4包开发一个包含多个Fragment的ViewPager。

当用户更改页面时,我试图隐藏视图。因此,我实现了一个OnPageChangeListener来侦听适配器,并在页面发生更改时调用Fragment中的update()方法。但是我得到了一个NullPointerException,我不知道为什么。

代码如下:

代码语言:javascript
复制
public class MyActivity extends FragmentActivity implements
        OnPageChangeListener {

    private static final int NUM_ITEMS = 2;
    private ViewPager mPager;
    private static SpaceAdapter mAdapter;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_pager);

        mAdapter = new SpaceAdapter(getSupportFragmentManager());
        mPager = (ViewPager) findViewById(R.id.pager);
        mPager.setAdapter(mAdapter);

        mPager.setOnPageChangeListener(this);
}

    public static class SpaceAdapter extends FragmentPagerAdapter {

        public SpaceAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public int getCount() {
            return NUM_ITEMS;
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
            case 0:
            return new MyFragment();
            case 1:
            return new MyFragment();
            default:
            return new MyFragment();
            }
        }
    }

    @Override
    public void onPageScrollStateChanged(int arg0) {
        Log.i("pagination", "scroll state changed: " + arg0);
}

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {
        // Log.i("pagination", "page scroll: " + arg0 + " with: " + arg1 + ", " + arg2);
        if (mAdapter.getItem(arg0) instanceof IUpdateOnPage) {
            ((IUpdateOnPage) mAdapter.getItem(arg0)).updateOnPage();
        }
    }

    @Override
    public void onPageSelected(int arg0) {
        Log.i("pagination", "page selected: " + arg0);
    }
}

代码语言:javascript
复制
public class MyFragment extends Fragment implements
        SurfaceHolder.Callback, IUpdateOnPage {

    private SurfaceView charts;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.crew, null);
        bindViews(v);
        return v;
    }

    private void bindViews(View v) {
        charts = (SurfaceView) v.findViewById(R.id.civ_charts);

        charts.getHolder().addCallback(this);
        Log.i("wtf", "huh " + String.valueOf(charts == null)); // logs false
    }

    @Override
    public void updateOnPage() {
        if (charts != null) {
            Log.i("crew surface", "hidden");
            charts.setVisibility(View.GONE);
        } else {
            Log.i("crew surface", "charts is null");  //THIS HERE gets logged
        }
    }
}

wWhen我复制/粘贴了SurfaceHolder.Callback方法,但它们仍然存在。如果为charts == null,则bindViews(v)方法记录,并且总是返回false。当我分页时,updateOnPage被调用,charts == null返回true。为什么会发生这种情况,我该如何解决?

这是第108行:

代码语言:javascript
复制
charts.setVisibility(View.GONE);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-25 12:26:37

在初始化ViewPager时添加以下内容:

代码语言:javascript
复制
mPager.setOffscreenPageLimit(NUM_ITEMS-1);

在您的示例中,这会将屏幕外页面的数量设置为1(即,当其他页面当前处于焦点状态时,它会将额外的屏幕外页面保留在内存中)。这将迫使您的ViewPager保留所有的Fragment,即使它们不在焦点中。

票数 37
EN

Stack Overflow用户

发布于 2012-03-25 12:47:30

我检查了您的代码,我认为问题出在onPageScrolled中,您调用的是getItem。这个实现(实际上就像web上的大多数实现一样)每次都会返回一个新的实例。但是,我见过的大多数示例都没有调用getItem,所以这通常是可以的。

在您的例子中,我会懒洋洋地在getItem中创建片段:如果不存在该位置的片段,则创建它,然后将其挂在ArrayList或其他集合中,但如果它已经存在,则从该集合返回它。

否则,您将创建一个片段实例A,然后滚动到另一个片段实例B。您尝试告诉片段实例A清理一些视图,但最终却告诉新的片段实例C这样做。它还没有机会建立自己的视图,所以您将得到指向图表的空指针。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9857420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档