16

フラグメントを動的に置き換えるアクティビティがあります。

private void goToFragment(Fragment newFragment, String tag) {
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, tag);
    ft.addToBackStack(null);
    ft.commit();
}

ここで、フラグメント内のビューにアクセスして、 を呼び出した直後に (アクティビティに保存した) データを配置できるようにしますgoToFragment

問題は、onCreateView少なくとも私の理解では、フラグメントが完全にレンダリングされる前にフラグメントが呼び出されないことです。

フラグメント内のをオーバーライドすることはそれを行う1つの方法であることは知っていますonAttach(Activity activity)が、それを自分のアクティビティに具体的にキャストする必要があります-フラグメントが特定のアクティビティに依存することは悪い習慣だと考えているため、それを避けたいだけです.

私が見る限り、Fragment(サブジェクトとして)リスナーは実装されていません。

そのため、独自のリスナーを作成し (オブザーバー パターンを使用してフラグメントをサブジェクトにし、アクティビティをオブザーバーにする)、onCreateVieworonAttachが完了するたびにそれを呼び出し、最後にそのデータを使用してフラグメントにコールバックする必要があると考えています。設定する必要があります。ただし、いくつかのフラグメントに対してこれを行う必要があるため、フラグメントごとにリスナーを作成する必要があり、これも悪いと思います。

これを行うためのより良い/簡単な方法はありますか?

4

3 に答える 3

37

FragmentTransactionを呼び出した後、すぐには適用されませんcommit()。手動で更新を強制することができます:

...
mFragmentManager.executePendingTransactions();

AFAIK イベント コールバックの目的は、Fragment通常のライフサイクルを超えたカスタム通信です。

于 2012-06-02T20:03:09.203 に答える
4

それを行う正しい方法は、実装Activityする必要があることを表示したいクラスのインターフェースを定義することです。FragmentそうonAttachすれば、特定のものActivityにキャストするのではなく、インターフェイスにキャストできます。

たとえば、http: //developer.android.com/guide/topics/fundamentals/fragments.html#EventCallbacksを参照してください。

于 2012-06-02T18:09:53.573 に答える
2

を使用onActivityCreatedして値を設定する必要があります。

で参照をonCreateView設定し、 でそれらに値を設定しますonActivityCreated

于 2012-06-02T18:18:38.830 に答える