2012-12-06 14 views
11

私はサポートlib revを使用するように私のアプリケーションをアップグレードして以来。 11SDK 4.2に対してコンパイル私は次のエラーフラグメントがすでに追加されています。サポートlib

java.lang.IllegalStateException: Fragment already added: i{4079e598 #2 id=0x1020002 i} 
    at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1159) 
    at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:729) 
    at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1493) 
    at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:477) 
    at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:174) 

を受け、私はstackoverflowの上で同様の問題について読んだことがあります。それらのうちのいくつかは、私が使用していない置換方法を避けることを提案しています。ロールバックでクラッシュが発生したトランザクションは、次のようになります。

ft.remove(oldFrag).add(newFrag).addToBackStack(null).commit() 

他のコメントは、ユーザーが再び押す前に十分に迅速に終えることができないフラグメントトランジションを使用している場合、これが発生する可能性がありますと言います。 与えられたフラグメントでトランジションアニメーションを使用するので、これが原因である可能性があります。しかし、移行を削除することは選択肢ではなく、このは2.325を実行する電話機でのみが発生し、lib 11とsdk 4.2にアップグレードしてバグが導入されました。次のリリースで修正されることを願っています。

これは4.2.1で修正される予定か、r12でサポートされる予定か、エラーを回避するために何ができるのかについての情報があります。

+0

「DialogFragment」と同じことをします。 –

+0

私はDialogFragmentで時折それを取得します...私はレポート[ここ](http://code.google.com/p/android/issues/detail?id=41552&thanks=41552&ts=1355757013)を提出しました。しかしまだ答えはありません。 – phlebas

+0

サポートライブラリr12で同じエラーが発生しました。 Androidの課題トラッカーにもトレースを投稿しました。 – Sash0k

答えて

6

は私がhere

を見つけたヒントを使用して問題を解決しようとしていますので、私はすぐにトランザクションを実行するためにexecutePendingTransactions()を追加しました:

ft.remove(oldFrag).add(newFrag).addToBackStack(null).commit() 
getFragmentManager().executePendingTransactions(); 

これはbackstackはクリーンな状態に常にあることを確認する必要があります私は、私が考えることができる否定的な欠点がないことを願っています。

更新、それは通常の携帯電話で仕事をしていますが、問題は4.0.1または類似のように、知られているAndroidのバージョン番号を持っていないいくつかの一般的なデバイス上に残り、代わりに木3月2日」のようないくつかの日を報告し 2006年の00:00:00 GMT + 0100(MEZ) 'のアンドロイドバージョン番号、例えば:samsung - espressowifixx - GT-P3110は、アンドロイドバージョンとして指定された日付を報告し、フラグメントが例外を追加しました。ユーザーはこのようなことに気にしないので、常に不利なデベロッパーであり、非難されています。 もちろん、10億ドルの企業でも問題はありませんが、単一の開発者は、書き込みアプリよりも時間をかけて便利です)

+0

私は全く同じクラッシュを取得していますが、私は上の行を全く使用していません。私はft.add(newFrag).addToBackStack(null).commit()をこのように追加するだけです。 – tasomaniac

+0

@phlebas SUpportライブラリのFragmentManager.javaクラスを編集することをお勧めしますか? – Adi

+0

コードを記述してください。 –

5

私にとっては、実際にはフラグメントを2回追加しようとしていました。多分以前のサポートライブラリのバージョンでは、これを飲み込んでいたかもしれません。残念ながら、私のケースでは、トランザクションが実際に最初のフラグメントを追加する時間がある前に、私はそれらをバック・トゥ・バック・バック(back to back)と呼んでいたので、フラグメントisAdded()が私のために機能しなかったかどうかをチェックしました。

私がやったことは、ブール値のクラス変数fragmentAddedを作成し、トランザクションを行った直後にそれをtrueに設定することでした。次に、フラグメントを追加しようとする前に、このブール値をチェックします。あなたの問題の解決策ではないかもしれませんが、私にとってはそうだったので、うまくいけば助けてください。

+5

私たちはこれを行う必要が本当に悲しい。フラグメントが追加されたかどうかを明確に伝える方法はありませんか? –

関連する問題