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