1

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

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)
4

3 に答える 3

1

ビューでフラグメントを置き換えることができないようです。インフレーション中に、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;
        }
于 2012-10-01T14:42:16.307 に答える
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() メソッドには奇妙な動作がいくつかあるようで、期待どおりに動作するとは限りません。 の人も同様に回避策を使用する必要がありました。

于 2011-08-08T20:14:10.073 に答える
0

置き換える前に、追加されたフラグメントが機能するかどうかを確認してください。

于 2011-10-12T03:17:39.267 に答える