2016-04-19 12 views
16

Ho un'attività con 3 frammenti, attualmente utilizzo ViewPager. Voglio realizzare MVP e comunicare tra l'attività del presentatore e il frammento presentatori cioè:MVP Android - Come comunicare tra l'activity presenter e il framment presenter

  • dati che passano da un'attività presentatore di presentatori frammento
  • Invio evento da presentatori frammento all'attività presentatore
  • ...

Ma non so come farlo in modo ufficiale. Posso usare BusEvent ma non penso che sia una buona pratica.

+0

Potete fornire maggiori dettagli sul vostro caso d'uso? perché ci sono alcune possibili risposte in diversi casi d'uso come: creazione di una regola aziendale universale, utilizzo di dipendenza, utilizzo di bus eventi, passaggio di bundle ai tuoi frammenti, ecc. –

+0

Puoi menzionare esempi di dati/eventi che vuoi passare tra i presentatori ? Ti sono una fonte di dati comune per esempio? – elmorabea

risposta

0

Come da mia conoscenza, per il vostro UseCase, supponiamo che ActivityA abbia un viewPager con 3 frammenti (FragmentA, FragmentB, FragmentC).

ActivityA avere ActivityPresenterA

Fragmenta hanno FragmentPresenterA

Come da MVP, FragmentPresenterA dovrebbe essere responsabile di tutti i flussi logici e di business solo di fragmenta e dovrebbe comunicare con solo fragmenta. Pertanto, FragmentPresenterA non può comunicare direttamente con ActivityPresenterA.

Per la comunicazione da Frammento a Attività, il relatore non dovrebbe essere coinvolto e ciò dovrebbe essere fatto come si farebbe per comunicare in architettura non MVP, cioè con l'aiuto dell'interfaccia.

Lo stesso vale per la comunicazione tra attività e frammento.

Per la comunicazione tra attività e Frammento leggere here

+0

Questo approccio è il più pulito? Cosa succede se questi frammenti sono legati solo ai dati? Non dovrebbe essere fatto diversamente in questo caso? – kkkkk

+0

Se tutti i frammenti di ViewPager sono collegati tra loro con dati o condivide dati comuni, in quel caso i frammenti non devono avere diversi presentatori, piuttosto che ActivityPresenter dovrebbe gestire tutta la logica aziendale di questi frammenti e trasmettere i dati ai frammenti corrispondenti con l'aiuto delle interfacce. – nnn

0

È possibile utilizzare una presentatrice per quel caso.

Utilizzato il Presentatore attività per ottenere tutti i dati necessari ai frammenti. quindi creare una classe di interfaccia e implementarla sui tuoi frammenti.

Ad esempio:

creare un'interfaccia pubblica per la vostra PageAFragment (questa interfaccia sarà il ponte dei dati dall'attività di frammentare). e usa il metodo della tua interfaccia per gestire il risultato del tuo relatore da visualizzare.

Questo è l'esempio di classe di interfaccia che ho creato per i dati ricevuti. per il parametro puoi scegliere quello che vuoi dipende dal tuo bisogno, ma per me scelgo il modello.

public interface CallbackReceivedData { 
    void onDataReceived(YourModel model); 
} 

In MainActivity categoria Check l'istanza di frammento attaccato nella vostra attività. inserisci l'istanza di controllo dopo aver eseguito il commit del frammento.

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); 
    } 

} 

ho pensato che il receivedDataFromPresenter è il metodo ricevuta della nostra visione e ottenere dati da presentatore.

E ora passeremo i dati dal presentatore di callbackReceivedData

In PageAFragment attuare la CallbackReceivedData e sovrascrivere il onDataReceived metodo. Ora puoi passare i dati dall'attività al tuo frammento.

public class PageAFragment extends Fragment implements CallbackReceivedData{ 

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

    } 

    @Override 
    public void onDataReceived(YourModel model) { 

    } 
} 

Nota: modo alternativo, è possibile utilizzare Bundle e passare i dati con l'uso di setArguments.

Se si desidera inviare Evento da Frammento all'attività è possibile seguire questa Idea.

Creare una classe di interfaccia e implementarla sul MainActivity e scavalcare il metodo dall'interfaccia alla propria attività, per My case lo faccio qualcosa del genere.

Ecco la mia classe CallbackSendData.

public interface CallbackSendData { 
    void sendDataEvent(String event); 
} 

Implementare interfaccia CallbackSendData al MainActivity e l'override del metodo 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. 
    } 



} 

E per il vostro PageAFragment è necessario utilizzare il metodo collegare per lanciare l'interfaccia. Il metodo attach chiamato una volta che il frammento è associato alla sua attività. Se vuoi capire il ciclo di vita del frammento fai clic su questo link: 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(); 
     } 
    } 

}

E ora è possibile utilizzare il CallbackSendData per inviare i dati dall'attività a frammentarsi.

Nota: è molto più semplice se si utilizza Iniezione di dipendenza per il progetto, è possibile utilizzare la libreria di Dagger2.

Goodluck.

Problemi correlati