ViewPager碎片会随着时间的推移而被破坏?

edt*_*ird 17 java android nullpointerexception android-fragments android-viewpager

我正在使用Android的support.v4软件包来开发包含多个Fragments 的ViewPager .

我试图在用户更改页面时隐藏视图.所以,我实现了一个OnPageChangeListener来监听我的适配器,并update()Fragment发生页面更改时调用我的方法.但是我得到了一个NullPointerException,我无法弄明白为什么.

这是代码:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我复制/粘贴时,我删除了SurfaceHolder.Callback方法,但它们在那里.该bindViews(v)方法记录if charts == null,并始终返回false.当我打页时,updateOnPage被调用,并charts == null返回true.为什么会发生这种情况,我该如何解决这个问题呢?

这是第108行:

charts.setVisibility(View.GONE);
Run Code Online (Sandbox Code Playgroud)

Ale*_*ood 36

初始化时添加以下内容ViewPager,

mPager.setOffscreenPageLimit(NUM_ITEMS-1);
Run Code Online (Sandbox Code Playgroud)

在您的情况下,这会将屏幕外页面的数量设置为1(即,当其他页面当前处于焦点时,它会将额外的屏幕外页面保留在内存中).即使它们没有聚焦,这也会迫使你ViewPager保留所有的Fragments.