마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Activity와 Fragment에 의한 설계 방식 판단좀 부탁드립니다.

0 추천

안녕하세요. 근 1주일간 어플리케이션 뼈대 설계하면서 어느정도 윤곽이 잡혔는데 두가지 방법 중 어느쪽이 더 좋을지 판단이 잘 안섭니다. 조언좀 얻고싶습니다.

화면 이미지는 대략 위와 같습니다. 

실제 화면에 나오는 디자인적인 부분은 검은 테두리 부분이라고 보시면되고 초록색은 설계 방법중 하나를 표현하기 위해서 넣은것입니다.

화면 사양에 대해 먼저 설명하겠습니다.

1. ①、②는 마스터 레이아웃입니다. 어느 화면에서든 항상 표시됩니다.

2. ③은 페이지별로 표시화면이 바뀝니다. 바디 컨텐츠 정도로 생각하시면 되겠습니다.

3. 중요한건 아닌데 메인메뉴는 아래에 6개지만 실제로 하위 메뉴와 페이지들이 더 있습니다(전부해서 20페이지 정도 될 것 같습니다)

만들기 앞서 두가지 포인트를 가장 중요하게 생각하고 있습니다.

부품화, 성능 및 메모리 릭(어플 크래쉬) 방지.

아래는 제가 생각한 두가지 설계 방법입니다.

1. 1 페이지 1 엑티비티

2. 1 MainActivity, 페이지 이동은 ③의 BodyContent Fragment를 Replace하는 방식.

1번의 구체적인 설명을 드리겠습니다. 위에 첨부한 이미지가 딱 이 1번 방식을 표현하고 있습니다.

Master Activity안에 헤더, Liniear Layout(Body Content로서 사용), Footer를 배치합니다.

각 페이지 예를들어 Home, Home2, Home3별로 Activity를 준비하고 Master Activity를 계승합니다. 그리고 각 Activity를 열때는 Linear Layout의 표시를 바꿉니다. Home Activity를 예로 들면

public class HomeActivity extends MasterHeaderActiviy {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_home);

    LinearLayout layout = (LinearLayout)findViewById(R.id.layMainContent);
    layout.removeAllViews();
    getLayoutInflater().inflate(R.layout.activity_home, layout);
  }
}

위와 같이 됩니다. 

2번 방식은 MasterActivity안에 배치 하는것은 동일하지만 위 소스 layMainContent가 들어가는 부분에 Fragment가 들어갑니다. 각 페이지별로 Fragment를 만듭니다. 예를들어 Home Fragment를 만들어서 메뉴 이동은 Fragment.Replace를 이용해서 Home2 Fragmet로 바꾸거나 하는 방식입니다.

여기 계신 선배님들은 어떤 방법이 더 좋아보시는 지요. 

제가 1번과 2번 방법에서 각각 장단점으로 생각하고 있는점은 다음과 같습니다.(틀릴수도 있습니다 지적해 주시면 정말 감사하겠습니다.)

1번 방법 장점. 

1 .화면 1 엑티비티로 소스 구성이 알기 쉽게됨.

2. 페이지 이동은 엑티비티의 Intent -> Finish로 하기떄문에 페이지 이동으로 인한 메모리 스택이 쌓일 걱정이 없을 것 같음(진짜?)

3. AppCompatActivity 를 계승하고 있기때문에 프로그래밍이 매우매우편함.

1번 방법 단점.

1. 페이지 이동간에 Activity를 생성 -> Finish 하기떄문에 바디 컨텐츠의 Fragemnt만 전환하는 방식에 비해 페이지 이동이 느릴 것 같음.

 

2번 방법 장점.

1. 페이지 이동시 Fragment 부분만 전환 하기때문에 Activity 초기화 -> 생성 -> 종료보다 페이지 이동 퍼포먼스가 좋을 것 같음.

2번 방법 단점

1. 페이지 이동(프래그먼트 전환)시 엑티비티는 계속 같은것을 사용 하기때문에 프래그먼트를 이동할떄마다 메모리 스택이 쌓이지 않을까 걱정. 예를 들어 Home1 페이지부터 6페이지까지 순서대로 이동했을때 엑티비티가 Home1,2,3,4,5,6 Fragment의 리소스를 다 가지고 있는게 아닐까 걱정됨.

2. Activity를 계승하고 있기때문에 프로그램에 한계가 오는게 아닐까 싶은 경우가 있음.

마스터 레이아웃의 Bottom 과 Top Header는 안드로이드에서 각각 Bottom Navigation Activity(BNA)와 Navigation Drawer Activity(NDA)로 제공합니다. Bottom 메뉴 같은경우 BNA는 메뉴 개수가 5개로 한정 되어있기 때문에 그냥 버튼 배치해서 Fragment로 만들었 습니다. 이건 성공적이였는데 문제는 탑 헤더 였습니다. 

 NDA소스를 참고해서 Fragment로 만들어 보려고 했으나 Drawer과 Togle을 만들수가 없었습니다. AppCompatActivity를 계승하면 간단히 되는데 Fragment를 계승하면 도저히 안되겠더군요. 결국 마스터 Bottom Fragment와 Body Fragment는 각각 프래그먼트 파일로 해서 부품화에 성공하였으나 헤더는 포기하고 그냥 Master Activity에 헤더부분 레이아웃과 Java의 처리 코드를 다 기입했습니다. 원래 하고싶었던건 헤더, 바디, 바텀 셋 다 Fragment로 부품화 한 후에 Master Activity는 이 세개를 배치만 하고 싶었습니다. 아무튼 2번 방법을 사용 했을 경우. 개발 도중에 위와 같은 문제가 또 발생하지 않을까 하는 걱정이 가장 큽니다. 어떻게 생각하시나요.

결론.

1. 두가지 방법 중에 다른 분들은 어떤 방식이 더 정답에 가깝다고 생각하시는지 알고싶습니다(1번이 더 안드로이드의 화면 구성에 어울린다던가 디자인 패턴적으로 올바르다던가)

2. 두 방법의 장단점중 제가 잘못알고 있는점이나 다른분들께서 알고 계신점 등 의견을 듣고싶습니다(특히 단점들에 관한 부분)

장문의 질문 읽어 주셔서 감사합니다. 좋은하루 되세요.

gs낭천 (340 포인트) 님이 2018년 1월 17일 질문

2개의 답변

+1 추천
1번안의 모든 장점은 Fragment를 사용하는 경우에도 적용 되는 내용이라 1번안 만의 장점이라고 생각할 수가 없네요.

언급되지 않은 단점은 더 많구요.

이런 형태의 UI는 거의 표준처럼 널리 사용되는 형태가 있는데 안하는 이유가 있나요?

http://www.devexchanges.info/2016/05/android-basic-training-course-combining.html

 

헤더와 컨텐츠와 탭 영역을 모두 Fragment로 하려고 하는데도 이유가 있나요?

Fragment는 하나의 use-case레벨의 모듈인데...헤더와 탭영역은 그냥 뷰이고...

액션바와 바텀레이아웃을 메인에서 일괄되게 처리하고 내부 컨텐츠만 프레그먼트로 담당하는 것이 일반적입니다.
smashdown (720 포인트) 님이 2018년 1월 18일 답변
0 추천
저는, 2번 방식으로 할 것 같습니다.

말씀해주신 1번 방식은 제가 실력이 부족해서 인지 이해가 안가네요. 1번 방식으로 하면 왠지 바디컨텐츠의 컴포넌트에 클릭이벤트 등을 등록하는게 복잡해 질거 같습니다.

그리고 하셨다고 말씀하신것처럼
바디컨텐츠만 Fragment로 하고 공통부분(BNA, NDA 등)은 AppCompactActivity를 상속받은 MainActivity 에서 처리하면 되지 않을까 생각됩니다.
눈빛 (4,120 포인트) 님이 2018년 1월 17일 답변
눈빛님이 2018년 1월 17일 수정
일단 2번 방식으로 샘플 프로그램 작성중 이지만 아직 확정은 안됐습니다 결정하는데 참고하겠습니다.
좋은 의견 감사합니다.
...