2014-01-10 12 views
7

これは少し複雑な質問ですが、私はそれをできるだけ簡単にするつもりです。スワップ後にビューポケベルの断片の子フラグメントが消える

開始するには、ビューページャーで主なアクティビティがあります。 2ページがあり、各ページをリンクする2つのアクションバーのタブがあります。 また、4つのオプションを持つ引き出しがあります。最初の2つはビューページャーの2ページで、2番目のページは表示されないページです。 2番目の2つのうちの1つを選択した場合、ViewPagerを2つの他のものと交換するように設定しました。これらのフラグメントはすべてシングルトンなので、前後に切り替えてもメモリの問題は発生しません。

フラグメントの2番目のセットに切り替えると、フラグメントの1つに、ボタンが選択されたときに子フラグメントをスワップアウトするためのフレームがあります。ここに問題があります。そのフラグメントが最初に読み込まれた後、正常に動作します。しかし、引き出しを使用して最初のセットに切り替えた後、再び2番目のセットに戻すと、子フラグメントはなくなります。その後、あなたが何かをした後でクラッシュする傾向があります。

これは私がコードで少し周りプレイする場合、私はこのような何かを得ること

01-10 15:55:05.272: E/MessageQueue-JNI(21034): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentManagerImpl.performPendingDeferredStart(android.support.v4.app.Fragment)' on a null object reference 

のクラッシュログです。これらの2つのエラーは、私が最も生産するように見えるものです:

01-10 16:00:13.072: E/AndroidRuntime(22227): java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.ClassLoader android.support.v4.app.FragmentActivity.getClassLoader()' on a null object reference 

私はフレームビュー上)(置き換える呼び出すために続けることができますので、それが離れないだろう。したがって、私はそれが問題ではないと推測しています。それはいくつかの関連コードです。

フラグメントのコード:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.calculator, container, false); 
    final FragmentManager fragmentManager = getChildFragmentManager(); 
    if(afFrag == null && topFrag == null){ 
     afFrag = CalculatorAfFragment.getInstance(); 
     topFrag = CalculatorTopFragment.getInstance(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.replace(R.id.calc_frame, afFrag, "afFrag").commit(); 
    } 
    RadioGroup typeGroup = (RadioGroup) view.findViewById(R.id.type_buttons);   
    typeGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() 
    { 
     public void onCheckedChanged(RadioGroup group, int checkedId) { 
      if (checkedId == R.id.af_button){ 
       FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
       fragmentTransaction.replace(R.id.calc_frame, afFrag, "afFrag").commit(); 
      } 
      else if (checkedId == R.id.top_button){ 
       FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
       fragmentTransaction.replace(R.id.calc_frame, topFrag, "topFrag").commit(); 
      } 
     } 
    }); 
    return view; 

FragmentStatePagerAdapterコード:

@Override 
    public Fragment getItem(int position) { 
     if(tools){ 
      return toolsFragmentsList.get(position); 
     } else { 
      return guidesFragmentsList.get(position); 
     } 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     return POSITION_NONE; 
    } 

    public void swapFragments(int position){ 
     if (tools){ 
      tools = false; 
      stores = false; 
      notifyDataSetChanged(); 
      this.setPrimaryItem(mPager, position-1, getItem(position - 1)); 
     } else { 
      tools = true; 
      notifyDataSetChanged(); 
      this.setPrimaryItem(mPager, position-4, getItem(position - 4)); 
     } 
    } 
+0

「getClassLoader()」の呼び出しでエラーが発生しました。問題がどこにあるかが必要です。この時点で "getClassLoader()"を呼び出したインスタンスが完全に初期化されていることを確認してください。 – Sulfkain

+0

logcatにログの詳細を表示してください、私はそれがメッセージが最も関連性の高いものであることが奇妙なことがわかります。 – mobilepotato7

答えて

0

mPager.setId(View.generateViewId())経由ViewPagerに一意のIDを設定してみてください。