개발하는 두더지

[Android] Fragment와 MVP 패턴을 이용한 탭 만들기 본문

Java,Android

[Android] Fragment와 MVP 패턴을 이용한 탭 만들기

덜지 2017. 6. 22. 15:05

http://duzi077.tistory.com/119 ( Fragment 를 이용한 탭 만들기 ) 에 이어서 


MVP 패턴을 이용하여  TabLayout , ViewPager, Fragment를 이용한 탭을 만들어보도록 하겠습니다.




우선 MVP 패턴이란 ?


Model View Presenter

- View를 Model로부터 분리시키고 Presenter는 사이에서 중재자 역할을 합니다.

- Unit test를 쉽게할 수 있습니다.

- 일반적으로 View와 Presenter 는 1:1 매칭입니다.


Model          Data에 직접 접근하고 관리한다. Presenter가 요청한 작업을 수행한다.

View            실제 View에 접근하고 화면을 갱신하는 역할을 한다.

Presenter      View로부터 이벤트를 전달받고 View가 알지못하는 Data에 접근하고 로직을 수행하도록 Model 에 요청한다.






https://github.com/googlesamples/android-architecture/tree/todo-mvp ( 구글 MVP 예제 ) 를 참고하여 샘플을 만들었습니다.






결과물









소스코드


BaseView 생성

BaseView.java

Presenter를 설정하고 View에 Toast를 띄우는 인터페이스입니다.




BasePresenter 생성

BasePresenter.java

공통 로직이 있다면 여기에 추가합니다.




Contract 생성

RestaurantContract.java

Contract는 View와 Presenter를 연결해주는 인터페이스입니다.

각 Fragment 마다 BaseView와 BasePresenter를 상속받은 View, Presenter 인터페이스를 생성해야합니다.

즉, Base는 공통으로 작성해야되는 기능을 넣어주고 그 Base를 상속받아 각 Fragment의 View, Presenter 인터페이스를 생성해서 각각의 기능을 정의합니다.




PresenterImpl 생성

RestaurantPresenterImpl.java

Contract.Presenter를 implements한 Presneter 클래스입니다. View와 통신하기 위해 View 객체를 생성자 파라미터로 받아서 초기화합니다.

샘플에서 buttonClickAction 메소드가 실제로는 Model과 연결된 로직을 수행하는 부분입니다.

간단하게 로직이 처리됐다고 생각하고 View에 Toast를 띄우는 ShowToast 메소드만 출력하는 기능을 넣어놨습니다.




Fragment 생성

RestaurantTabFragment.java

Fragment는 Contract.View를 implements 한 View 클래스입니다. 

탭마다 다른 Fragment 클래스를 만들어야합니다.


버튼이 클릭되면 Presenter의 buttonClickAction 메소드가 호출됩니다.

Presenter에서 로직이 수행되고 마지막에 ShowToast를 호출하면 

Fragment에서 오버라이드된 ShowToast가 실행하면서 화면에 Toast가 띄워지게 됩니다.




Fragment Layout 생성

restaurant_frag.xml

탭을 클릭했을때 보여지는 페이지입니다.

탭마다 다른 Fragment 레이아웃을 만들어야합니다.




MainActivity 생성

MainActivity.java

위의 Google Sample과 조금 다릅니다. 

TabPagerAdapter 안에 각 Fragment의 Presenter를 관리합니다.




MainActivity Layout 생성

activity_main.xml

TabLayout과 ViewPager를 그립니다.


gradle 파일에 선언해야 사용 가능합니다.

dependencies {
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:design:25.3.1'
}




TabPagerAdapter 생성

TabPagerAdapter.java

FragmentPagerAdapter를 상속받은 Adapter입니다.


탭을 클릭했을 때 getItem 메소드가 호출되고 해당되는 Fragment 객체를 반환합니다.










Comments