0

http://developer.android.com/training/basics/fragments/communicating.htmlの例に基づいて、より大きなフラグメントのサブフラグメントである 2 つのフラグメント間の通信を再現しようとしました。

この例では、AB アクティビティには A フラグメントと B フラグメントが含まれています。しかし、私は同じことを達成しようとしていますが、私の場合、 AB Fragmentには A フラグメントと B フラグメントが含まれています。

問題は、AB Fragment でオーバーライドされたメソッドが呼び出されないことです。例のように、含まれているコンポーネントがアクティビティではなくフラグメントであるため、これは機能しませんか? ここで何かを見逃していますか?

4

2 に答える 2

2

onClick()または他のonSomething()ハンドラーを参照している場合、これらは常にActivityフラグメントではなくクラスで呼び出されます。したがって、リンクした例では、ネストされたフラグメントがある場合でも、onArticleSelected()は に残る必要があります。Activity

フラグメントに情報を渡すには、いくつかのオプションがあります。1 つは、アクティビティ内でフラグメントへの参照を保持できることです。これは、アクティビティが再作成されると失われる可能性があります (設定イベントなど)。

2 番目のより良い方法は、フラグメントにタグを付けてから を使用することfindFragmentByTagです。

フラグメントを追加するとき (フラグメントに付けたタグであるパラメーター「my_fragment」に注意してください):

getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, myFragment, "my_fragment").commit();

または、あるフラグメントを別のフラグメントに置き換える場合:

getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, myFragment, "my_fragment").comit();

次に、アクティビティ内からフラグメントで何かをしたい場合onArticleSelected:

Fragment fragment = getSupportFragmentManger().findFragmentByTag("my_fragment");
if (fragment != null) {
    fragment.articleSelected(articleId);
}
于 2013-05-11T11:04:32.093 に答える
0

Interfaceフラグメント間の通信には常に を使用できます。これが最も安全な方法です。

于 2013-05-11T11:07:08.747 に答える