0

フラグメントについて何か見逃しているかもしれませんが、この動作を理解できません:

フラグメントを含む FrameLayout を持つアクティビティがあります。通常どおり、方向を変更して新しい FrameLayout インスタンスを作成するたびに、アクティビティは破棄されます。しかし、フラグメントを再度作成したくありません。読み込みに時間がかかるため、同じフラグメント インスタンスを保持したいと考えています。

私がやっていることは次のとおりです(FrameLayoutにid = 324があると仮定します):

    FragmentManager mng = getFragmentManager();
    Fragment frag = (Fragment)mng.findFragmentByTag(DEFAULT_TAG);

    //I create a new fragment if it doesn't exist or I remove the fragment from any view that is attached if it existed
    if (frag==null) frag = new MyFragment();
    else mng.beginTransaction().remove(frag).commit();

    //I add the fragment to the newly created FrameLayout
    mng.beginTransaction().add(324, frag, DEFAULT_TAG).commit();

クラッシュします:

08-09 11:54:38.970: E/AndroidRuntime(2517): Caused by: java.lang.IllegalArgumentException: Binary XML file line #15: Duplicate id 0x7f050016, tag null, or parent id 0xffffffff with another fragment for com.test.PRMapFragment
08-09 11:54:38.970: E/AndroidRuntime(2517):     at android.app.Activity.onCreateView(Activity.java:4248)

初回は大丈夫なのですが、画面を回転させるとクラッシュします。MyFragment 内のフラグメントについて不平を言っていますが、フラグメントが変更されていないため意味がありません。

4

1 に答える 1

2

見てくださいFragment.setRetainInstance()http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)

これを に設定するとtrue、フラグメントのライフサイクルが変更され、アクティビティとともに破棄されて再作成されるのではなく、切り離されて新しいアクティビティに再接続されるだけになります。アクティビティのonRetainNonConfigurationInstance()コールバックにフックして、構成の変更間でオブジェクトを存続させます。

これを目に見えないフラグメントで数回使用して、構成の変更を超えて長時間実行される操作を実行できるようにしました。ビューのある可視フラグメントで試したことはありませんが、注意して使用できるはずです。

于 2013-08-09T10:07:39.363 に答える