との間で通信するためにどのように、現在、私はViewPagerを使用しています。私はMVPを実装し、プレゼンターとフラグメントのプレゼンターは、IEの活動の間で通信したい:活動のプレゼンターに、フラグメントのプレゼンターから AndroidのMVP - 私は3つの断片と活性を有する活動のプレゼンターとフラグメントプレゼンター
- ...
しかし、私は公式の方法でそれを行う方法がわかりません。私はBusEventを使うことができますが、それは良い習慣だとは思いません。私の理解あたりとして
との間で通信するためにどのように、現在、私はViewPagerを使用しています。私はMVPを実装し、プレゼンターとフラグメントのプレゼンターは、IEの活動の間で通信したい:活動のプレゼンターに、フラグメントのプレゼンターから AndroidのMVP - 私は3つの断片と活性を有する活動のプレゼンターとフラグメントプレゼンター
しかし、私は公式の方法でそれを行う方法がわかりません。私はBusEventを使うことができますが、それは良い習慣だとは思いません。私の理解あたりとして
、あなたのユースケースのために、ActivityAはviewPagerは3つのフラグメント(FragmentA、FragmentB、FragmentC)を有するがあるとします。
ActivityAはActivityPresenterA
FragmentAがMVPを1としてFragmentPresenterA
を持って、FragmentPresenterAだけFragmentAのすべての論理とビジネスフローの責任を負わなければならないとだけFragmentAと通信する必要があります。したがって、FragmentPresenterAはActivityPresenterAと直接通信することはできません。アクティビティにフラグメントからの通信を
、プレゼンターは関与すべきでない、我々は、すなわちインタフェースの助けを借りて、非MVPアーキテクチャで通信するように、これは行われるべきです。
同じことが通信を断片化するための活動に適用されます。活動とフラグメントとの間の通信のための
は、あなたがそのような場合のために1人のプレゼンターを使用することができますhere
をお読みください。
は、あなたの破片が必要とするすべてのデータを得るためにあなたの活動プレゼンターを使用します。 次にインターフェイスクラスを作成し、それをあなたのフラグメントに実装します。例えば
:
が(活動からのデータのブリッジが断片化します。このインタフェース)あなたのPageAFragmentためのパブリックインターフェイスを作成します。インターフェイスのメソッドを使用してプレゼンターの結果を表示して表示することができます。
これは受信データ用に作成したインターフェイスクラスの例です。あなたが必要とするものを選択することができますが、私にとってはモデルを選択します。 MainActivityクラスで
public interface CallbackReceivedData {
void onDataReceived(YourModel model);
}
あなたの活動に添付フラグメントのインスタンスを確認してください。フラグメントをコミットした後に、チェック・インスタンスを置く。
public class MainActivity extends AppCompatActivity{
private CallbackReceivedData callbackReceivedData;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//after commit the fragment
if (fragment instanceof PageAFragment){
callbackReceivedData = (CallbackReceivedData)fragment;
}
}
//this is the example method of MainActivity Presenter,
//Imagine it, as your view method.
public void receivedDataFromPresenter(YourModel model){
callbackReceivedData.onDataReceived(model);
}
}
私はreceivedDataFromPresenterは、私たちのビューの受信方法であると仮定し、プレゼンターにデータを取得します。
そして今、我々はCallbackReceivedDataを実装し、はメソッドをオーバーライドしますonDataReceived PageAFragmentでcallbackReceivedDataにプレゼンターから
データを渡します。これで、アクティビティのデータをフラグメントに渡すことができます。
public class PageAFragment extends Fragment implements CallbackReceivedData{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onDataReceived(YourModel model) {
}
}
注:別の方法、あなたはバンドルを使用してsetArgumentsを使用してデータを渡すことができます。
イベントをフラグメントからアクティビティに送信する場合は、このアイデアに従います。
Interfaceクラスを作成し、それをMainActivityに実装し、メソッドをインターフェイスからあなたのアクティビティにオーバーライドします。私の場合、このようなことを行います。
私のCallbackSendDataクラスです。
public interface CallbackSendData {
void sendDataEvent(String event);
}
あなたMainActivityにCallbackSendDataインタフェースを実装し、sendDataEventメソッドをオーバーライドします。
public class MainActivity extends AppCompatActivity implements CallbackSendData{
private CallbackReceivedData callbackReceivedData;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//after commit the fragment
if (fragment instanceof PageAFragment){
callbackReceivedData = (CallbackReceivedData)fragment;
}
}
//this is the example method of MainActivity Presenter,
//Imagine it, as your view method.
public void receivedDataFromPresenter(YourModel model){
callbackReceivedData.onDataReceived(model);
}
@Override
public void sendDataEvent(String event){
//You can now send the data to your presenter here.
}
}
そして、あなたはあなたのインターフェイスをキャストする方法を取り付け使用する必要があなたのPageAFragmentへ。 attachメソッドは、フラグメントがアクティビティに関連付けられると呼び出されます。フラグメントのライフサイクルを理解したい場合は、このリンクをクリックしてください:https://developer.android.com/reference/android/app/Fragment.html。
public class PageAFragment extends Fragment implements CallbackReceivedData{
private CallbackSendData callbackSendData;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onDataReceived(YourModel model) {
//Received the data from Activity to Fragment here.
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup
container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.PagerAFragment, container,
false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle
savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Button Eventbutton;
Eventbutton = view.findViewById(R.id.event_button);
Eventbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
callbackSendData.sendDataEvent("send Data sample");
}
});
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try{
callbackSendData = (CallbackSendData) context;
}catch (ClassCastException e){
e.printStackTrace();
}
}
}
そして今、あなたは、フラグメントに活動からのデータを送信するためにCallbackSendDataを使用することができます。
注:プロジェクトに依存性注入を使用する場合は、Dagger2ライブラリを使用できます。
Goodluck。
あなたのユースケースについてさらに詳しく説明できますか?なぜなら普遍的なビジネスルールの作成、依存関係注入の使用、イベントバスの使用、断片へのバンドルの渡しなど、さまざまな用途でいくつかの可能な答えがあるからです。 –
プレゼンターの間でやりとりするデータ/ ?たとえば、共通のデータソースですか? – elmorabea