2017-03-15 35 views
8

Podążam za wzorcem projektowym MVP dostarczonym przez Google, aby uzupełnić moją aplikację. Mam jedną Główną Aktywność i wiele Fragmentów i wydaje mi się, że nie mam kłopotów z tworzeniem aktywności dla każdego fragmentu, więc zastanawiałem się, czy zarejestrować fragment prezentera. Co ja widzę, że każdy fragment zarejestrować własną prezenter, ale nie jestem pewien, jak bardzo źle jest ... :)Czy mogę zarejestrować prezentera MVP wewnątrz Fragmentu

Więc tutaj jest mój Prezenter:

public class FirstPresenter implements FirstContract.Presenter { 
    private final FirstContract.View mView; 

    public FirstPresenter(FirstContract.View view) { 
     mView = view; 
    } 

    @Override 
    public void start() { 
     Log.e(TAG, "Start"); 
    } 
} 

I tu jest mój Fragment:

public class FirstFragment extends Fragment implements FirstContract.View { 
    private FirstContract.Presenter mPresenter; 

@Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container 
      , Bundle savedInstanceState) { 
... 
// I register firstFragment's presenter here. 
mPresenter = new FirstPresenter(this); 
... 

Moje pytanie brzmi: czy to właściwa droga? Czy mogę zarejestrować Prezentera w Fragment zamiast w Aktywności? A jeśli nie jest to właściwe, czy istnieje dobry przykład, aby obsłużyć MVP z jednym działaniem i wieloma fragmentami?

Dziękuję, BR!

+1

W przykładowym kodzie w repozytorium Android Blueprint, w "Aktywności" pojawi się 'Prezenterzy', ale rejestracja będzie również wykonana wewnątrz' Fragmentu'. Zobacz 'TaskDetailActivity' na przykład: https://github.com/googlesamples/android-architecture/blob/todo-mvp/todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp/ taskdetail/TaskDetailActivity.java - używamy także MVP w naszej aplikacji i dokonujemy rejestracji w ten sam sposób. Nie widzę problemu w robieniu tego w ten sposób. – Darwind

Odpowiedz

8

Jak widać w próbek Google (https://github.com/googlesamples/android-architecture) Activities tworzyć Presenters. Również Views dołączyć do Activity i Presenters uzyskać widoki (Fragments) jako parametr.

Po Fragment transakcja popełnienie lub Fragment (zobacz) stan przywrócony Presenters się stworzony i wziąć Fragments (widoki) jako parametr niż zadzwonić

view.setPresenter(T presenter); 

metod poglądów i Presenters się zarejestrować, aby obejrzeć.

Myślę, że tworzenie Presenter w Fragment nie jest dobrą praktyką. Przede wszystkim są one oddzielne warstwy. Jest to niezgodne z prawem dla Separacja obaw. Po drugie, jeśli tworzysz prezentera w Fragment, wiążesz życie swojego Prezentera z LifeCycle, a kiedy Fragment jest niszczony i odtwarzany, tworzysz nowego prezentera, ale są to różne warstwy.

Model to interfejs definiujący dane, które mają być wyświetlane lub w inny sposób wykorzystywane w interfejsie użytkownika.

Prezenter działa na modelu i widoku. Pobiera dane z repozytoriów (model) i formatuje je do wyświetlania w widoku.

Widok to pasywny interfejs, który wyświetla dane (model) i trasuje polecenia użytkownika (zdarzenia) do prezentera, aby działał na podstawie tych danych.

Tak Activity może działać jako overall controller, który tworzy Presenters i Views i łączy je.

enter image description here

Jeśli mówimy o Twoje pytanie, tak można zarejestrować prezentera w fragmentu. Ale powinieneś unikać tworzenia prezentujących w fragmentach, których używasz jako widoku.

Ale jest wiele różnych podejść dotyczących wzorca MVP w społeczności Androida, jak poniżej. https://plus.google.com/communities/114285790907815804707

Dlaczego aktywności nie są elementami interfejsu użytkownika? http://www.techyourchance.com/activities-android/

+1

Dziękujemy za szczegółową odpowiedź! Ponieważ wyglądasz na doświadczonego programistę, masz rozwiązanie, jak rozwiązać problem z jednym działaniem i wieloma fragmentami? – MilanNz

+2

jak wspomniałem w mojej odpowiedzi, jeśli potrzebujesz wielu fragmentów w tej samej aktywności, możesz pozwolić działowi tworzyć nową transakcję fragmentu fragmentu zatwierdzenia, tworzyć prezentację i łączyć je. ale nie widziałem takiej implementacji w próbkach Google. realizują 1 działanie - 1 fragment. – savepopulation