2012-06-19 8 views
7

フラグメントを復元しようとすると、アンドロイドアプリがクラッシュする問題が発生しました。私は復元しようとしているバンドルにカスタム変数を追加していません。すべてデフォルトです。私はFragmentsとViewPagerを使用しています。以下の私のコードスニペットを参照してください。フラグメントとViewPagerを使ってしばらくしてAndroidアプリがクラッシュする

public static class MyAdapter extends FragmentStatePagerAdapter { 
    public MyAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public int getCount() { 
     return NUM_ITEMS; 
    } 

    public int getCurrentItemPosition(Fragment fragment){ 
     return getItemPosition(fragment); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return ContentFragment.newInstance(position); 
    } 
} 

public class MyActivity extends FragmentActivity { 

static final int NUM_ITEMS = 100000; 
public int currentSelectedPage; 
private int changeToFragmentIndex; 
public DateTime midDate; 
MyAdapter mAdapter; 
ViewPager mPager; 

/** Called when the activity is first created. */ 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.diary); 
    MyApplication application = (MyApplication)getApplication(); 
    application.dataController.myActivity = this; 
    mAdapter = new MyAdapter(getSupportFragmentManager()); 
    mPager = (ViewPager)findViewById(R.id.pager); 
    mPager.setAdapter(mAdapter); 
    int newDay = application.daysBetween(DateTime.now(), DateTime.parse(application.day.dateToShortString())); 

    this.currentSelectedPage = NUM_ITEMS/2+newDay; 
    mPager.setCurrentItem(NUM_ITEMS/2+newDay); 
    mPager.setOnPageChangeListener(new SimpleOnPageChangeListener(){ 
     public void onPageSelected(int position){ 
      currentSelectedPage = position; 
      ContentFragment fragment = (ContentFragment) mAdapter.instantiateItem(mPager, currentSelectedPage); 
      fragment.loadData(); 
     } 
    }); 
} 

} 

public class ContentFragment extends Fragment { 
private View v; 
static final int NUM_ITEMS = 100000; 

static ContentFragment newInstance(int num) { 
    ContentFragment f = new ContentFragment(); 

    return f; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    if (container == null) 
     return null; 
    v = inflater.inflate(R.layout.diarycontent, container, false); 
    return v; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

} 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState){ 
    super.onSaveInstanceState(savedInstanceState); 
    setUserVisibleHint(true); 
} 
} 

私はこのstackstraceを受け取る:

Caused by: java.lang.NullPointerException 
at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:519) 
at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:1 55) 
at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:522) 

私は、これはサポートパッケージおよびその一つの可能​​な解決策で知られている問題がある可能性があります理解してきたようにsetUserVisibleHintを使用することです( true)をonSaveInstanceStateに設定します。しかし、それは役に立たなかった。

誰かがこの問題の別の解決方法を知っているのですか、間違っていますか?

あなたがやっているのはなぜ正確に
+0

ハイテク?私もそのようなエラーが発生し、まだ解決策を見つけることができません – hakim

+0

私も、あなたたちは何かを見つけたか? @hakim – henrikpersson

+0

あなたは私のために働くこの答えを使用することができます http://stackoverflow.com/questions/18642890/fragmentstatepageradapter-with-childfragmentmanager-fragmentmanagerimpl-getfra –

答えて

-1

mPager.setOnPageChangeListener(new SimpleOnPageChangeListener(){ 
    public void onPageSelected(int position){ 
     currentSelectedPage = position; 
     ContentFragment fragment = (ContentFragment) mAdapter.instantiateItem(mPager, currentSelectedPage); 
     fragment.loadData(); 
    } 
}); 

この:

@Override 
public Fragment getItem(int position) { 
    return ContentFragment.newInstance(position); 
} 

は、フラグメントをインスタンス化します。

あなたはフラグメントにこのようなデータをロードすることができます

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
super.onActivityCreated(savedInstanceState); 
loadData(); 
} 
+0

私はフラグメントを正しく更新するためにいくつかの問題があったので、私はそれをしていました。私はあなたのコードをテストし、クラッシュはまだ発生します。 – xteci

+0

これを解決できましたか?私はこの問題に固執しています – Preethi

+0

これは私のために解決した、またはそれを実際に隠したhttp://stackoverflow.com/questions/18642890/fragmentstatepageradapter-with-childfragmentmanager-fragmentmanagerimpl-getfra –

20

私はタブの内側FragmentStatePagerAdapterでViewPagerを使い始めたら、私は問題の同じ種類に直面しています。

私はこの問題に関連するすべてのフォーラムで遊んで、この問題がなぜ発生したのか、それを解決する方法を見つけるために2日間頭を悩ませましたが、私の必要条件を満たす完璧な解決策は見つかりませんでした。

FragmentStatePagerAdapterの代わりにFragmentPagerAdapterを使用するNPEクラッシュを避けるために解決策を得ました。私がFragmentStatePagerAdapterの代わりにFragmentPagerAdapterを置き換えると、NPEクラッシュの問題に直面しませんでしたが、同じページがそれ以降のナビゲーション(これは私の要件です)のためにリフレッシュされません。

最後に、FragmentStatePagerAdapterのsaveStateメソッドをオーバーライドし、正常に動作するものはすべて正常に動作します。私は簡単にこの問題を再現する方法

@Override 
public Parcelable saveState() { 
    // Do Nothing 
    return null; 
} 


:私は上位バージョン(4.1)デバイスを使用して、以下の手順に続いています
:[設定]を
1. - >開発者向けのオプションを。
2. [アクティビティを保存しない]オプションをクリックします。

今私は自分のアプリで遊んだ。

android.support.v4.app.FragmentManagerImpl.getFragment(Unknown Source)のNPEのためにアプリがクラッシュするたびに、saveState()メソッドをオーバーライドする前に。しかし、saveState()をオーバーライドした後にクラッシュは登録されません。

私はそうすることで何の問題も起こらないことを願っています。

+0

Rlyありがとう! –

+4

それは動作します!なぜ誰が知っていますか? – Archit

+0

非常にありがとう!それは完全に動作します –

0

@Lalit Kumar Sahooが提案したソリューションを使用しました。しかし、私は重大な問題に気付きました:装置を回転させるたびに、フラグメントマネージャは古いフラグメントを削除せずに新しいフラグメントを追加しました。そこで私はさらに検索し、回避策の提案(post #1)のバグレポートを見つけました。私は、この修正プログラムを使用して私のアプリでテスト、問題は、任意の副作用なしに解決することが表示されます。

回避策: /プロジェクトのsrc /アンドロイド/サポートのカスタムFragmentStatePagerAdapter V4/appフォルダを作成し、それを使用します。あなたはこの問題を解決してきた@xteci

package android.support.v4.app; 

import android.os.Bundle; 
import android.view.ViewGroup; 

public abstract class FixedFragmentStatePagerAdapter extends FragmentStatePagerAdapter { 

    public FixedFragmentStatePagerAdapter(FragmentManager fm) { 
    super(fm); 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
    Fragment f = (Fragment)super.instantiateItem(container, position); 
    Bundle savedFragmentState = f.mSavedFragmentState; 
    if (savedFragmentState != null) { 
     savedFragmentState.setClassLoader(f.getClass().getClassLoader()); 
    } 
    return f; 
    } 
} 
+1

"mSavedFragmentState"は利用できません... –

関連する問題