여러 Fragment
을 포함하는 ViewPager를 개발하기 위해 안드로이드의 support.v4
패키지를 사용하고 있습니다.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/I는 SurfaceHolder.Callback
방법을 제거 붙여하지만이있다. bindViews(v)
메서드는 charts == null
인 경우 로그를 남기며 항상 false를 반환합니다. 페이지가 열릴 때 updateOnPage
이 호출되고 charts == null
이 true를 반환합니다. 왜 이런 일이 일어나고 어떻게 해결할 수 있습니까?
이 108 라인 : 귀하의 경우에 당신이 당신의 ViewPager
를 초기화 할 때 다음과 같은 추가
charts.setVisibility(View.GONE);
추가 조사를 마친 후에도 페이지 매김이 시작될 때 조각이 파괴된다고 가정합니다 (보기가 남아 있더라도?). 스 와이프 때 새 조각이 전체보기로 스냅 될 때까지 조각을 "반"볼 수 있습니다. 따라서 모든 참조가 수집되고 왼쪽 모두가 뷰인 경우 어떻게해야합니까? – edthethird
'NullPointerException'을 얻는다면, logcat 출력을 게시 할 수 있습니까? –
잘 예외가 throw되지 않도록 실제로 catch하고 있어요. 문제는'charts.setVisibility (View.GONE);'입니다. 차트가 null입니다. 두 번째 코드 예제의 마지막 부분 인 'else'바로 위에 있습니다. 스택 추적을 추가했습니다. – edthethird