私はAndroidのsupport.v4
パッケージを使用して、複数のFragment
を含むViewPagerを開発しています。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
メソッドを削除し、彼らはそこにあります。 bindViews(v)
メソッドは、charts == null
の場合にログを記録し、常にfalseを返します。私がページすると、updateOnPage
が呼び出され、charts == null
がtrueを返します。なぜこれが起こり、どのように私はそれを回避するのですか?
と、これは108行です:あなたのケースでは、あなたのViewPager
を初期化する場合は、次を追加します
charts.setVisibility(View.GONE);
さらに詳しい調査の後、ページングが始まると(たとえビューが残っていても)フラグメントが破壊されると仮定しています。スワイプすると、私はまだ新しい断片がフルビューになるまで断片の「半分」を見ることができます。したがって、すべての参照が収集され、残っているすべてがビューである場合、どのようにこれを行うことができますか? – edthethird
'NullPointerException'を取得している場合は、logcat出力を投稿できますか? –
私は実際にそれをキャッチしているので、例外はスローされません。問題は 'charts.setVisibility(View.GONE);'です。チャートはnullです。これは 'else'のすぐ上にある2番目のコードサンプルの最後です。スタックトレースを追加しました。 – edthethird