Android MVP - comment communiquer entre le présentateur d'activité et le présentateur de fragment

j'ai une activité avec 3 fragments, actuellement j'utilise ViewPager. Je veux mettre en œuvre MVP et communiquer entre le présentateur d'activités et les présentateurs de fragments I. e:

  • transmettre les données d'un présentateur d'activité à un présentateur de fragment
  • envoi de l'événement des présentateurs de fragments à l'animateur de l'activité
  • ...

Mais je ne sais pas comment le faire de manière officielle. Je peux utiliser BusEvent mais je ne pense pas que ce soit une bonne pratique.

20
demandé sur Tan Tran 2016-04-19 06:00:33

4 réponses

selon mon entendement, pour votre UseCase, supposez ActivityA avoir un viewPager ayant 3 Fragments (FragmentA, FragmentB, FragmentC).

ActivityA have ActivityPresenterA

FragmentA have FragmentPresenterA

selon MVP, FragmentPresenterA devrait être responsable de tous les flux logiques et commerciaux de FragmentA seulement et devrait communiquer avec FragmentA seulement. Par conséquent, FragmentPresenterA ne peut pas communiquer directement avec ActivityPresenterA.

pour la communication de Fragment à activité, le présentateur ne devrait pas être impliqué et ceci devrait être fait comme nous le ferions pour communiquer dans une architecture non MVP, c.-à-d. avec l'aide de l'interface.

il en va de même pour L'activité de communication entre fragments.

Pour la communication entre l'Activité et le Fragment de lire ici

0
répondu nnn 2017-02-10 14:01:57

Vous pouvez utiliser un présentateur de cette affaire.

utilisé votre présentateur D'activité pour obtenir toutes les données dont vos fragments ont besoin. ensuite, créez une classe d'interface et implémentez-la dans vos fragments.

Par exemple:

créer une interface publique pour votre PageAFragment (cette interface sera le pont de vos données de l'activité au fragment). et d'utiliser la méthode de votre interface pour gérer le résultat de votre animateur d' vue.

c'est l'exemple de classe d'interface que j'ai créé pour les données reçues. pour le paramètre vous pouvez choisir ce que vous voulez il dépend de votre besoin, mais pour moi je choisis le modèle.

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

Classe D'Activité Principale Vérifiez l'instance du fragment qui s'est attaché à votre activité. mettez votre instance de vérification après avoir commis le fragment.

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

}

j'ai supposé que le receivedDataFromPresenter est la méthode reçue de notre point de vue et obtenir des données pour le présentateur.

Et maintenant, nous allons transmettre les données à partir de presenter callbackReceivedData

PageAFragment mettre en œuvre les CallbackReceivedData et Outrepasser le onDataReceived méthode. Maintenant, vous pouvez transmettre les données de l'activité à votre fragment.

public class PageAFragment extends Fragment implements CallbackReceivedData{

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

    }

    @Override
    public void onDataReceived(YourModel model) {

    }
}

Note: de manière Alternative, vous pouvez utiliser Bundle et passer les données avec l'utilisation de setArguments.

si vous voulez envoyer L'événement de Fragment d'Activité vous pouvez suivre cette Idée.

créer une classe D'Interface et l'appliquer à votre MainActivity et outrepasser la méthode de l'interface à votre activité, pour mon cas je le fais quelque chose comme ceci.

Voici mon CallbackSendData Class.

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

implémenter CallbackSendData interface vers votre MainActivity et Outrepasser le sendDataEvent méthode.

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.
  }



}

Et PageAFragment vous devez utiliser la méthode attach pour lancer votre interface. La méthode d'attache appelée dès que le fragment est associé à son activité. Si vous voulez comprendre le cycle de vie d'un fragment cliquez simplement sur ce lien: 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();
        }
    }

}

et maintenant, vous pouvez utiliser le CallbackSendData envoyer les données de l'activité au fragment.

Note: c'est beaucoup plus facile si vous utilisez L'Injection de dépendances à votre projet, vous pouvez utiliser la bibliothèque Dagger2.

Goodluck.

0
répondu Benidict Dulce 2018-03-04 13:13:37

pour communiquer entre un Fragment et Activity (que ce soit entre leurs présentateurs ou leurs classes), vous avez besoin d'une interface que votre activité implémente (comme