60

したがって、再初期化時にフラグメントがクラッシュしないようにするには、空のコンストラクターが必要であることを学びました。私の問題は、フラグメントが初期化されるときにフラグメントのデータのリストを使用することです (少なくともそれらの一部)。では、データのリストを使用して新しいフラグメントを開始するにはどうすればよいでしょうか。他のソースからデータを取得OnCreate()するメソッドを作成する必要がありますか、それとも適切なアプローチでしょうか?getData

大量のデータがあるため、バンドルにデータを供給することは、実際にはあまり良い方法ではありません。

それでは、ケースを取り上げましょう(その方がはるかに優れていることを理解しています)。

ユーザーがボタンをクリックすると、フラグメントが開始されます。私が以前行っていたのは、この方法で新しいフラグメントを作成することでした:

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    
    fragmentTransaction.replace(R.id.center_container, new DetailFragment(item));
    fragmentTransaction.addToBackStack(DETAIL_TAG);
    
    fragmentTransaction.commit();

次に、私のフラグメントで:

public DetailFragment(EventItem item) {
    mItem = item;
    mPlaces = Database.getContainerPlaces(getActivity()).getValidItems();
}

すべてのデータをバンドルに渡すことはできないため、機能しません。それで、私は何をすべきですか?

A: 空のコンストラクターでフラグメントを初期化し、アクティビティからセッターを使用してデータをフラグメントに直接設定する必要がありますか? ただし、ユーザーがホームを押して Android がフラグメントを閉じ、ユーザーが後で戻ってきた場合、データが失われることはありませんか?

B: ファクトリ パターンと callsetRetainInstance(true)でフラグメントを初期化し、フラグメントにデータを識別するためのキーを与えてから、フラグメントに onCreateView で必要なデータを第 3 のソースから取得させる必要がありますか?

C: 空のコンストラクターを作成してonCreate()から、フラグメントに必要なデータを取得する必要がありますか?

アプリは縦向きにロックされているため、問題は主に、Android を閉じてユーザーが再起動したときにオブジェクトを維持することにあることに注意してください。

4

1 に答える 1

74

では、データのリストを使用して新しいフラグメントを開始するにはどうすればよいでしょうか。

次のように、ファクトリ パターンと「引数」を使用しますBundle

package com.commonsware.empublite;

import android.os.Bundle;

public class SimpleContentFragment extends AbstractContentFragment {
  private static final String KEY_FILE="file";

  protected static SimpleContentFragment newInstance(String file) {
    SimpleContentFragment f=new SimpleContentFragment();

    Bundle args=new Bundle();

    args.putString(KEY_FILE, file);
    f.setArguments(args);

    return(f);
  }

  @Override
  String getPage() {
    return(getArguments().getString(KEY_FILE));
  }
}

フラグメント インスタンスを保持している場合は、通常のセッターを使用してデータ メンバーにデータを入れるだけで済むはずです。「引数」Bundleは構成変更の一部として保持されるため、保持されないインスタンスの場合、これは、ユーザーが画面を回転させた場合などにセットアップ データが保持されるようにする方法です。

于 2012-05-29T11:52:03.537 に答える