È 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.
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. –
Puoi menzionare esempi di dati/eventi che vuoi passare tra i presentatori ? Ti sono una fonte di dati comune per esempio? – elmorabea