0

2つのフラグメントAとBがあります。ここでBにはリストが含まれています。選択したリスト項目のフラグメントAに通知するリスナーをフラグメントBに追加したいと思います。フラグメントBのリスナーを初期化する方法を理解できませんでした。なぜなら、フラグメントのコンストラクタで引数を渡すことは悪い習慣であるからです。2つのフラグメントの間にリスナーを追加する

注:フラグメントBはフラグメントAに含まれています。つまり、フラグメントAにはFrameLayoutがあります。フラグメントBはそのFrameLayoutをカバーします。

どのように私はそれを行うことができますか?

+0

http://stackoverflow.com/questions/7149802/how-to-transfer-some-data-to-another-fragment – XxGoliathusxX

+0

データではなく、インターフェイスのリスナーです。 – riadrifai

+0

あなたはイベントバスライブラリを試すこともできます。それはコミュニケーションを簡単にするはずです。しかし、@ JPalによって提案された解決策はうまくいくはずです。これはもっと標準的な方法です。 –

答えて

0

あなたは断片Bは、フラグメントA、その後、あなたが使用するのと同じアプローチを使用することができます(つまり、あなたが使用してフラグメントAのgetChildFragmentManager()は、フラグメントにそれを追加しました)の子断片であることを言っている場合Activityインターフェイスの場合、getActivity()の代わりにgetParentFragment()を使用します。例えば

フラグメントB:

@Override 
public void onAttach(Context context) { 
    MyInterface myInterface = (MyInterface) getParentFragment(); 
} 

フラグメントAがMyInterfaceを実装すると仮定すると。

我々はフラグメントが他のフラグメントによってホストされているか、活動のようなものであるかどうかを知ることを避けるために使用してきた一つの便利なメソッド:

public static <T> getInterface(Class<T> interfaceClass, Fragment thisFragment) { 
    final Fragment parent = thisFragment.getParentFragment(); 
    if (parent != null && interfaceClass.isAssignableFrom(parent)) { 
     return interfaceClass.cast(parent); 
    } 

    final Activity activity = thisFragment.getActivity(); 
    if (activity != null && interfaceClass.isAssignableFrom(activity)) { 
     return interfaceClass.cast(activity); 
    } 

    return null; 
} 

次に、あなただけ使用することができます。

MyInterface myInterface = getInterface(MyInterface.class, this); 
は、

であり、フラグメントBが子フラグメントとしてホストされているのか、アクティビティ内で直接ホストされているのかは関係ありません。

+0

これは私が必要とするものを提供するようですが、私はgetChildFragmentManager()を使用していないので、私はそれを研究して試してみましょう、ありがとう! – riadrifai

4

あなたがしたいことはフラグメント間の通信であるため、インターフェイスを使用することです。あなたはBが変更されたときにAに通知したいと思う。これは、親アクティビティを通じて実行する必要があります。トピックに関するアンドロイドのドキュメントは、https://developer.android.com/training/basics/fragments/communicating.htmlです。

要点は、OnItemSelectedというメソッドでインターフェイスを定義したいということです(名前は任意です)。 Bでは、このインターフェースへの参照が必要です。アイテムが選択されたら、新しいOnItemSelectedメソッドを呼び出します。 2つのフラグメントの親アクティビティでこのインタフェースを実装します。実装では、あなたは

通信インタフェース

public interface CommunicationInterface { 
    public void onItemSelected(int position); 
} 

FragmentB

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    CommunicationInterface myInterface = (CommunicationInterface) getActivity(); 
    // What ever else you want here 
} 

@Override 
public void onListItemClick(ListView l, View v, int position, long id) { 
    // Send the event to the host activity 
    myInterface.onItemSelected(position); 
} 

あなたがA.を変更したいものは何でもコード例を置くことができますMainActivity

public class MainActivity extends FragmentActivity { 
    // What ever other code you have 

    @Override 
    public void onItemSelected(int position) { 
     FragmentA fragA = (FragmentA) 
     getSupportFragmentManager().findFragmentById(R.id.fragment_a); 

     // Code to interact with Fragment A 
    } 
+0

はい私はこれを見て、それを試しました。しかし、私の場合、フラグメントBはフラグメントAの内側にあります。後でフラグメントが増えるので、すべてのインターフェイスをメインアクティビティから実装するのは面倒です。なぜ新しいアプローチを探しているのでしょうか? 。 – riadrifai

0

チェックアウト契約のパターンhttps://gist.github.com/JakeWharton/2621173

あなたが複数のフラグメントを使用している場合、あなたは1を持っている場合は、ちょうどあなたのBaseActivityに追加し、すべてのフラグメントのためにそれを行う持っていけません。

この例では、アクティビティとフラグメントの間の通信を示します。しかし、ネストされたフラグメントの場合は、acitivyをgetParentFragment()に置き換えることができます。

関連する問題