2016-04-19 24 views
16

との間で通信するためにどのように、現在、私はViewPagerを使用しています。私はMVPを実装し、プレゼンターとフラグメントのプレゼンターは、IEの活動の間で通信したい:活動のプレゼンターに、フラグメントのプレゼンターから AndroidのMVP - 私は3つの断片と活性を有する活動のプレゼンターとフラグメントプレゼンター

  • をイベントを送信
  • フラグメントのプレゼンターに活動プレゼンターからのデータを渡す

    • ...

    しかし、私は公式の方法でそれを行う方法がわかりません。私はBusEventを使うことができますが、それは良い習慣だとは思いません。私の理解あたりとして

  • +0

    あなたのユースケースについてさらに詳しく説明できますか?なぜなら普遍的なビジネスルールの作成、依存関係注入の使用、イベントバスの使用、断片へのバンドルの渡しなど、さまざまな用途でいくつかの可能な答えがあるからです。 –

    +0

    プレゼンターの間でやりとりするデータ/ ?たとえば、共通のデータソースですか? – elmorabea

    答えて

    0

    、あなたのユースケースのために、ActivityAはviewPagerは3つのフラグメント(FragmentA、FragmentB、FragmentC)を有するがあるとします。

    ActivityAはActivityPresenterA

    FragmentAがMVPを1としてFragmentPresenterA

    を持って、FragmentPresenterAだけFragmentAのすべての論理とビジネスフローの責任を負わなければならないとだけFragmentAと通信する必要があります。したがって、FragmentPresenterAはActivityPresenterAと直接通信することはできません。アクティビティにフラグメントからの通信を

    、プレゼンターは関与すべきでない、我々は、すなわちインタフェースの助けを借りて、非MVPアーキテクチャで通信するように、これは行われるべきです。

    同じことが通信を断片化するための活動に適用されます。活動とフラグメントとの間の通信のための

    は、あなたがそのような場合のために1人のプレゼンターを使用することができますhere

    +0

    このアプローチは最もクリーンですか?これらのフラグメントがデータにのみ関連する場合はどうなりますか?この場合、これを違う方法で行うべきではありませんか? – kkkkk

    +0

    ViewPagerのすべてのフラグメントがデータで共有されていたり、共通のデータを共有している場合、フラグメントは異なるプレゼンターを持つ必要はなく、ActivityPresenterはこれらのフラグメントのすべてのビジネスロジックを処理し、インタフェースの助けを借りて。 – nnn

    0

    をお読みください。

    は、あなたの破片が必要とするすべてのデータを得るためにあなたの活動プレゼンターを使用します。 次にインターフェイスクラスを作成し、それをあなたのフラグメントに実装します。例えば

    が(活動からのデータのブリッジが断片化します。このインタフェース)あなたの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); 
    } 
    

    あなたMainActivityCallbackSendDataインタフェースを実装し、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。

    関連する問題