2011-07-25 11 views
1

私のアプリケーションでは、オーバーレイサイドパネル(ナビゲーションメニュー)とメインレイアウトであるLinearLayoutで構成されるアクティビティが1つあります。私はレイアウト上のトランザクションを行い、内部のフラグメントを置き換えます。私はバックスラックを一切使用しないので、ユーザーが前方にナビゲートできるようにしています。代わりに、私は、ユーザーがメニュー内を前方へナビゲートするときに、フラグメントインスタンスをメモリ内に保持するためにハッシュマップ(擬似キャッシュ)を使用します。このアプローチの唯一の問題は、現在メインレイアウトにあるフラグメントをキャッシュからのフラグメントに置き換えるときにクラッシュすることです(私はデバッガでそれを実行し、FragmentTransaction.replaceバックスタック(?)を確認してください)。私はその問題が何であるかについてはあまりよく分かりません。Android:フラグメントとバックスタック

07-25 22:03:47.690: ERROR/AndroidRuntime(3141): FATAL EXCEPTION: main 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141): java.lang.IllegalStateException: Fragment already added: GuideFragment{409f2fd8 id=0x7f06008c} 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at android.app.BackStackRecord.doAddOp(BackStackRecord.java:322) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at android.app.BackStackRecord.replace(BackStackRecord.java:360) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at android.app.BackStackRecord.replace(BackStackRecord.java:352) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at StartActivity.changeContent(StartActivity.java:194) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at StartActivity$5.onClick(StartActivity.java:165) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at android.view.View.performClick(View.java:3117) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at android.view.View$PerformClick.run(View.java:11935) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at android.os.Handler.handleCallback(Handler.java:587) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at android.os.Handler.dispatchMessage(Handler.java:92) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at android.os.Looper.loop(Looper.java:132) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at android.app.ActivityThread.main(ActivityThread.java:4025) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at java.lang.reflect.Method.invoke(Method.java:491) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at dalvik.system.NativeStart.main(Native Method) 
+0

ポストのように更新しましたlogcat – antlersoft

+0

からスタックトレースする必要があります。私は、Backstackの代わりにHashMapにフラグメントを保持させることが可能なのでしょうか?ドキュメンテーションによると、フラグメントはBackstackに追加されなければ破壊されます。それでも、HashMapに追加して後で取得すると、nullではありません。また、なぜLogCatはBackstackに最初に置かれなかったときにFragmentがすでに追加されていると私に伝えていますか? –

+0

エミュレータまたは物理デバイスでテストしていますか?私は、私のアプリで同様の方法でフラグメントを処理し、それは物理的なデバイス上で正常に動作しますが、エミュレータでこの同じエラーでクラッシュします。 – theisenp

答えて

1

私は同様の問題を抱えています。私のコメントで述べたように、私のアプリは物理的なデバイスで正常に動作しますが、エミュレータでクラッシュします。私はなぜそれがFragment already addedエラーを投げている肯定的ではないが、私は回避策を見つけた。

フラグメントを置き換える前に、まずtry-catchブロックを使用してフラグメントを削除します(直感的ではないようですが、私にとってはうまくいくようです)。

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
try 
{ 
    fragmentTransaction.remove(guideFragment); 
} 
catch(IllegalStateException e) 
{ 
    e.printStackTrace(); 
} 
fragmentTransaction.replace(R.id.container, guideFragment, GUIDE_FRAGMENT_TAG); 
fragmentTransaction.commit(); 

replace()メソッドには、奇妙な振る舞いがあり、期待通りに動作しないようです。 Othersも回避策を使用しなければなりませんでした。

0

交換する前に追加された断片が機能するかどうかを確認してください。

1

あなたのフラグメントは、ビューで置き換えられないようです。 Inflatingでは、LayoutInflater.inflate()の3番目のパラメータが欠落している可能性があります。

チェック、それは

 @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      View view = inflater.inflate(R.layout.session_frag, container, false); 
      return view; 
     } 
関連する問題