【发布时间】:2012-04-09 02:07:30
【问题描述】:
我正在使用Android的support.v4包来开发一个包含多个Fragments的ViewPager。
我试图在用户更改页面时隐藏视图。因此,我实现了一个OnPageChangeListener 来监听我的适配器,并在发生页面更改时在我的Fragments 中调用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
}
}
}
w当我复制/粘贴时,我删除了 SurfaceHolder.Callback 方法,但它们在那里。 bindViews(v) 方法记录 charts == null,并且总是返回 false。当我页面时,updateOnPage 被调用,charts == null 返回 true。为什么会发生这种情况,我该如何解决?
这是第 108 行:
charts.setVisibility(View.GONE);
【问题讨论】:
-
好的,经过进一步调查,我假设片段在分页开始时被破坏(即使视图仍然存在?)。滑动时,我仍然可以看到“一半”片段,直到新片段捕捉到全视图。所以,如果所有的引用都被收集了,剩下的就是视图,我该怎么做呢?
-
如果您收到
NullPointerException,您可以发布 logcat 输出吗? -
好吧,我实际上正在捕捉它,因此不会引发异常。问题是
charts.setVisibility(View.GONE);。图表为空。它位于第二个代码示例的最后,位于else的正上方。添加了堆栈跟踪。
标签: java android nullpointerexception android-fragments android-viewpager