我正在使用安卓的support.v4
包开发一个包含多个Fragment
的ViewPager。
当用户更改页面时,我试图隐藏视图。因此,我实现了一个OnPageChangeListener
来侦听适配器,并在页面发生更改时调用Fragment
中的update()
方法。但是我得到了一个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);
}
}
和
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行:
charts.setVisibility(View.GONE);
发布于 2012-03-25 12:26:37
在初始化ViewPager
时添加以下内容:
mPager.setOffscreenPageLimit(NUM_ITEMS-1);
在您的示例中,这会将屏幕外页面的数量设置为1(即,当其他页面当前处于焦点状态时,它会将额外的屏幕外页面保留在内存中)。这将迫使您的ViewPager
保留所有的Fragment
,即使它们不在焦点中。
发布于 2012-03-25 12:47:30
我检查了您的代码,我认为问题出在onPageScrolled
中,您调用的是getItem
。这个实现(实际上就像web上的大多数实现一样)每次都会返回一个新的实例。但是,我见过的大多数示例都没有调用getItem
,所以这通常是可以的。
在您的例子中,我会懒洋洋地在getItem
中创建片段:如果不存在该位置的片段,则创建它,然后将其挂在ArrayList
或其他集合中,但如果它已经存在,则从该集合返回它。
否则,您将创建一个片段实例A,然后滚动到另一个片段实例B。您尝试告诉片段实例A清理一些视图,但最终却告诉新的片段实例C这样做。它还没有机会建立自己的视图,所以您将得到指向图表的空指针。
https://stackoverflow.com/questions/9857420
复制相似问题