1

ネストされた子フラグメントを親フラグメントに追加しようとしています。

すべて正常に動作しますが....

最初に私のコード:

public class FragmentDatasheetWithHeader extends Fragment {
   private long   mRowId;
   private String mSid;

   @Override
   public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {

      final ScrollView scrollView = new ScrollView(getActivity());
      final LinearLayout linearLayout = new LinearLayout(getActivity());
      linearLayout.setId(4711);
      linearLayout.setOrientation(LinearLayout.VERTICAL);

      scrollView.addView(linearLayout);

      createUI();

      return scrollView;
   }

   private void createUI() {

      final FragmentProductDetailHeader fragmentHeader = FragmentProductDetailHeader.newInstance(this.mRowId, FragmentProductDetailHeader.HEADERTYPE_SMALL);
      final FragmentDatasheet fragmentDatasheet = FragmentDatasheet.newInstance(this.mRowId, this.mSid);

      final FragmentManager fragmentManager = getChildFragmentManager();
      fragmentManager.beginTransaction().add(4711, fragmentHeader, "fragmentHeader").commit();
      fragmentManager.beginTransaction().add(4711, fragmentDatasheet, "fragmentDatasheet").commit();
   }
}

今私の問題:

開発者向けオプションで、「アクティビティを保持しない (ユーザーが離れるとすぐにすべてのアクティビティを破棄する)」を有効にしました。

FragmentDatasheetWithHeader を含むアクティビティが開いていて、アプリがバックグラウンドになり、フォアグラウンドに戻ると、ネストされたフラグメントが 2 倍になります。ただし、ネストされた Fragments のコンテナーが LinearLayout の場合にのみ表示されます。コンテナーが FrameLayout の場合、ネストされた Fragments は 2 倍になりません。

何がうまくいかないのですか?

4

1 に答える 1

2

コンテナーが FrameLayout の場合、ネストされた Fragments は 2 倍になりません。

それは本当ではない可能性があります。新しいフラグメントが古いフラグメントの上にある可能性が高く、効果的にそれらを覆い隠しています。したがって、根本的な問題はおそらく同じです。さまざまなViewGroup実装が子をどのように配置するかによって、視覚効果が異なるだけです。

そうは言っても、フラグメントが新たに「作成」されたのか、以前の状態から「復元」されたのかを簡単に判断する方法があります。(およびその他のさまざまなライフサイクル関連のメソッドなどBundle savedInstanceStateに渡されるパラメーターを見ることによって) .)。onCreateView()onActivityCreate()

より具体的には、おそらく次のようなものを に追加したいと思うでしょうonCreateView():

if (savedInstanceState == null) createUI();

そうすれば、復元する前の状態がない場合にのみフラグメントが追加されます。以前の状態がある場合、フレームワークは代わりに古いフラグメントを復元する必要があります。後者の場合、タグで検索することにより、復元されたフラグメントのハンドルを取得できます。

于 2013-08-31T02:06:39.893 に答える