2016-04-19 9 views
16

Mam aktywność z 3 fragmentami, obecnie korzystam z ViewPagera. Chcę, aby zaimplementować MVP i komunikować się między prezentera aktywność i fragmentów prezenterów tj:Android MVP - Jak komunikować się między prezenterem aktywności i prezentera fragmentów

  • przekazywanie danych z działalności prezenter prezenterów fragmentów
  • Wysyłanie wydarzenie z prezenterów fragmentu działalności prezenter
  • ...

Ale nie wiem jak to zrobić w oficjalny sposób. Mogę użyć BusEvent, ale nie sądzę, że to dobra praktyka.

+0

Czy możesz podać więcej szczegółów na temat swojego przypadku użycia? ponieważ istnieje kilka możliwych odpowiedzi w różnych przypadkach użycia, takich jak: tworzenie uniwersalnej reguły biznesowej, zastrzyk zależności, używanie magistrali zdarzeń, przekazywanie pakietów do fragmentów itp. –

+0

Czy możesz wymienić przykłady danych/zdarzeń, które chcesz przekazać między prezenterami ? Czy to na przykład wspólne źródło danych? – elmorabea

Odpowiedz

0

Zgodnie z moim rozumowaniem, dla UseCase, przypuśćmy, że ActivityA ma viewPager mający 3 Fragmenty (FragmentA, FragmentB, FragmentC).

ActivityA mieć ActivityPresenterA

Fragmenta mieć FragmentPresenterA

Zgodnie MVP, FragmentPresenterA powinien być odpowiedzialny za wszystkich logicznych i biznesowych przepływów tylko Fragmenta i powinien komunikować się tylko z Fragmenta. Dlatego FragmentPresenterA nie może bezpośrednio komunikować się z ActivityPresenterA.

W przypadku komunikacji z fragmentu do działania prezenter nie powinien się angażować i powinno to odbywać się w taki sposób, w jaki komunikujemy się w architekturze innej niż MVP, tj. Za pomocą interfejsu.

To samo dotyczy komunikacji z działaniem na fragmenty.

Do komunikacji między aktywnością i Fragment czytać here

+0

Czy to podejście jest najczystsze? Co jeśli te fragmenty są powiązane tylko z danymi? Czy w tym przypadku nie powinno to być zrobione inaczej? – kkkkk

+0

Jeśli wszystkie fragmenty ViewPagera są powiązane ze sobą danymi lub mają wspólne dane, w takim przypadku Fragmenty nie muszą mieć różnych prezenterów, a ActivityPresenter powinien obsługiwać całą logikę biznesową tych fragmentów i przekazywać dane do odpowiednich fragmentów za pomocą pomoc interfejsów. – nnn

0

Można użyć jednego prezentera dla tej sprawy.

Użyj swojego prezentera aktywności, aby uzyskać wszystkie dane potrzebne Twoim fragmentom. następnie utwórz klasę interfejsu i zaimplementuj ją do swoich fragmentów.

Na przykład:

Tworzenie interfejsu publicznego dla PageAFragment (ten interfejs będzie most danych z działalności na fragment). i użyj metody swojego interfejsu, aby obsłużyć wynik twojego prezentera do obejrzenia.

To jest przykład klasy interfejsu, którą utworzyłem dla otrzymanych danych. Parametr, który można wybrać, zależy od potrzeb, ale ja wybieram model.

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

W główną działalność Class czeku wystąpienie fragmentu, który przywiązany do swojej działalności. wstaw swoją instancję sprawdzającą po zatwierdzeniu fragmentu.

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

} 

Przypuszczałem, że receivedDataFromPresenter jest odbierany sposób naszym zdaniem i uzyskać dane do prezentera.

A teraz będziemy przekazywać dane z prezenterem do callbackReceivedData

W PageAFragment wdrożenia CallbackReceivedData i zastąpić onDataReceived metody. Teraz możesz przekazać dane z działania do twojego fragmentu.

public class PageAFragment extends Fragment implements CallbackReceivedData{ 

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

    } 

    @Override 
    public void onDataReceived(YourModel model) { 

    } 
} 

Uwaga: Alternatywny sposób można użyć Bundle i przekazywać dane z wykorzystaniem setArguments.

Jeśli chcesz wysłać wydarzenie od Fragment do działalności, możesz postępować zgodnie z tym pomysłem.

Utwórz klasę interfejsu i zaimplementuj ją do swojej Głównej Aktywności i Zastąp metodę od interfejsu do aktywności, dla Mojej sprawy robię to w ten sposób.

Oto moja CallbackSendData klasa.

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

Wdrożenie CallbackSendData interfejs do główną działalność i zastąpić sendDataEvent metody.

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



} 

I do PageAFragment trzeba użyć metody dołączyć do oddać swój interfejs. Metoda attach zostaje wywołana, gdy fragment zostanie powiązany z jego działaniem. Jeśli chcesz zrozumieć cykl życia fragmentu, kliknij ten 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(); 
     } 
    } 

}

I teraz można użyć CallbackSendData wysłać dane z działalności do fragmentu.

Uwaga: Jest znacznie łatwiej, jeśli używasz Dependency Injection do projektu, możesz użyć biblioteki Dagger2.

Goodluck.

Powiązane problemy