0

通常、アクティビティ+フラグメント通信では、onAttachメソッドで、コールバックインタフェースから定義したリスナーなどのコンテキストに物を割り当ててから、これを使用して基本的なアクティビティに実装された通信/呼び出し関数。例えばネストしたフラグメント/アクティビティ間の通信

public class TestDialogFragment extends DialogFragment { 
    private static final String ARGUMENT_KEYWORD = "argument_keyword"; 
    private String keyword; 
    private Button okButton; 
    private CallbackInterface callbackInterface; 

    public interface CallbackInterface { 
     void onCallbackInvoked(String keyword); 
    } 

    public static TestDialogFragment newInstance(String keyword) { 
     Bundle args = new Bundle(); 
     TestDialogFragment fragment = new TestDialogFragment(); 
     args.putString(ARGUMENT_KEYWORD, keyword); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     try { 
      callbackInterface = (CallbackInterface) context; 
     } 
     catch (ClassCastException e) { 
      throw new ClassCastException(context.toString() + " must implement TestDialogFragment.CallbackInterface"); 
     } 
    } 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     keyword = getArguments().getString(ARGUMENT_KEYWORD); 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View contentView = inflater.inflate(R.layout.dialogfragment_test, container, false); 
     okButton = (Button) contentView.findViewById(R.id.okButton); 
     okButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       callbackInterface.onCallbackInvoked(keyword); 
       getDialog().dismiss(); 
      } 
     }); 
     return contentView; 
    } 
} 

すべてが順調に良いとですが、あなたは(すなわち、最初の断片を起動するgetSupportFragmentManagerを()を使用しますが、その後getChildFragmentManager()を使用して)ネストされたフラグメントを使用している場合はどう?

たとえば、MainActivity - > FragmentA - > FragmentB - > FragmentCの場合はどうなりますか?

  1. FragmentCはMainActivityにコールバックをトリガすることができるようにFragmentCに至るまで、私のMainActivityのコンテキストのすべての方法を渡すために私のための方法はありますか?

  2. 逆はどうですか?私がMainActivityからFragmentCの中でいくつかの関数を呼び出して戻す方法はありますか?あるいは、「MainActivityは、FragmentC内の関数を呼び出すFragmentB内の同じ関数を呼び出しているFragmentAの関数を呼び出す」というようなことをしなければならないのでしょうか?

答えて

0

個人的にはこれを比較的クリーンな方法で実現するためにEventBusライブラリ(this oneなど)を使用しました。それが私の最初の勧告です。

Androidの枠組みの中での滞在:あなたの目標はしっかりとそれらを結合することなく、コンポーネント間で通信する場合、一つの可能​​性があるLocalBoadcastManager

。あなたは、本質的にEventBusの機能を再現することができ、しかし、それは使用しにくく便利/もっと面倒です:

  • あなたは、多くのBroadcastReceiverクラスを作成し、IntentFilter Sに登録する必要があります。
  • すべてのメッセージがブロードキャストされますIntent秒です。これは、通常、コードベースを浪費するたくさんのカスタムインテントアクション文字列を意味します。関連データはすべてエキストラにパックする必要があります(EventBusではメッセージとして任意のオブジェクトを使用できます)。

また、準EventBusを構築することもできます。メッセージを受け取るコンポーネントは、そのメッセージ用のインタフェースを実装し、それ自身をシングルトンクラスに登録します。誰かがメッセージを送信すると、シングルトンのメソッドが呼び出され、登録されたコンポーネントを繰り返してメッセージを配信します。

+0

サードパーティライブラリを使用せずにAndroidフレームワーク内で/あなたは何をしますか? – KaliMa

+0

@KaliMa私はポストをいくつかのアイディアで編集しました。率直に言って、私はあなたがそうした第三者図書館とほぼ同じ柔軟性のあるソリューションを見つけるつもりはないと思います。可能であれば、自分のソリューションを展開するよりも成熟したライブラリ(リンク先のライブラリなど)を使用するバグや問題が少なくなります。 – Karakuri