딜레마 : 프래그먼트 vs 액티비티 사용시기 :


785

나는 알고 Activities있지만, 내 응용 프로그램의 하나의 화면을 표현하기 위해 설계된 Fragments이들의 논리 내장 된 내부와 재사용 가능한 UI 레이아웃으로 설계되었습니다.

얼마 전까지 만해도 개발해야한다고하는 응용 프로그램을 개발했습니다. 나는를 만들어 Activity내 응용 프로그램 및 위해 사용되는 조각의 화면 표현하기 위해 ViewPager또는 Google Maps. ListFragment여러 번 재사용 할 수있는 UI를 거의 만들지 않았습니다 .

최근에 나는 단지 2가 포함 된 프로젝트에 발견 Activities하나는이다 SettingsActivity다른 하나는입니다 MainActivity. 의 레이아웃은 MainActivity많은 숨겨진 전체 화면 UI 조각으로 채워지며 하나만 표시됩니다. 에서 Activity논리 많습니다 FragmentTransitions응용 프로그램의 다른 화면 사이.

이 접근법에 대해 내가 좋아 한 것은 응용 프로그램이을 사용하기 때문에 ActionBar그대로 유지하고 화면 전환 애니메이션과 함께 움직이지 않는다는 것입니다. 이는 Activity전환으로 발생합니다 . 이것은 화면 전환에보다 유창한 느낌을줍니다.

그래서 내가 요구하는 것은이 주제와 관련하여 현재 개발 방식을 공유하는 것입니다. 처음에는 의견 기반 질문처럼 보일 수 있지만 Android 디자인 및 아키텍처 질문으로 생각합니다 ... 실제로는 그렇지 않습니다. 의견 기반의 하나.

UPDATE (2014년 1월 5일) 에 의해이 프리젠 테이션에 이어 에릭 버크 에서 광장 (. 내가 말을 안드로이드 개발자를위한 유용한 도구의 많은 훌륭한 프리젠 테이션입니다 그리고이 광장에 어떤 식 으로든 관련이없는 오전)

http://www.infoq.com/presentations/Android-Design/

지난 몇 달 동안의 개인적인 경험을 바탕으로 응용 프로그램을 구성하는 가장 좋은 방법 은 응용 프로그램 의 흐름 을 나타내는 조각 그룹을 만들어 모든 조각을 하나로 표시하는 것 Activity입니다. 따라서 기본적으로 Activities응용 프로그램에서 흐름 수 와 동일한 수를 갖습니다 . 이렇게하면 작업 표시 줄이 모든 흐름 화면에 그대로 유지되지만 흐름을 변경하면 많은 의미가있는 재생성됩니다. 에릭 버크 (Eric Burke)가 말했듯이, 내가 아는 것처럼, Activities가능한 한 적은 수 를 사용하는 철학은 그가 "하나님"활동이라고 부르는 것을 혼란스럽게하기 때문에 모든 상황에 적용 할 수있는 것은 아닙니다.


2
SO에서 내 게시물을 체크 아웃 - stackoverflow.com/questions/24647078/...
나의 하나님

답변:


270

전문가가 "UI를 볼 때 " Activity또는 Fragment"의 사용 여부를 알 수 있습니다 . 처음에는 이것이 의미가 없지만 시간이 지나면 실제로 필요한지 여부를 알 수 있습니다 Fragment.

저에게 매우 도움이되는 좋은 방법이 있습니다. 딸에게 무언가를 설명하려고 할 때 나에게 일어났다.

즉, 화면을 나타내는 상자를 상상해보십시오. 이 상자에 다른 화면을로드 할 수 있습니까? 새 상자를 사용하는 경우 첫 번째 상자에서 여러 항목을 복사해야합니까? 대답이 예인 경우, Fragments루트 Activity는 모든 복제 된 요소를 보유하여 작성 시간을 절약 할 수 있고 상자의 일부를 간단히 바꿀 수 있기 때문에 를 사용해야합니다 .

그러나 항상 상자 컨테이너 ( ) 가 필요 하거나 부품이 분산되어 있음을 잊지 마십시오Activity . 내부에 하나의 상자가 있습니다.

상자를 오용하지 않도록주의하십시오. Android UX 전문가는 명시 적으로 다른을로드 해야하는 경우 (YouTube에서 찾을 수 있음) Activity대신 Fragment(카테고리가있는 탐색 서랍을 처리 할 때와 같이) 사용하는 것이 좋습니다 . 에 익숙해지면 Fragments모든 동영상을 볼 수 있습니다. 훨씬 더 그들은 필수 자료입니다.

당신은 지금 당신의 UI를보고 당신이 Activity또는 여부를 알아낼 수 Fragment있습니까? 새로운 관점을 얻었습니까? 당신이 한 것 같아요


4
언급 한 YouTube 피드에 대한 링크가 있습니까? 'Android UX 전문가'및 'Android UX'를 검색하지만 어떤 동영상을 말하는지 확실하지 않습니다.
가구 있구만

2
더 이상, 1 년 전에 그것을 보았습니다. UX에 대해 이야기하는 Android 개발자 공식 검색
Sandalone

1
고려의 한 가지 예 : 활동에는 parentActivity가 있으므로 알림에서 입력하는 동안 백 스택을 합성 할 수 있지만 그러한 parentFragment는 없다고 생각합니다.
fikr4n

@BornToCode는 getParentFragment가 있습니다 : developer.android.com/reference/android/support/v4/app/…
ToolmakerSteve

@ToolmakerSteve 네, getParentFragment입니다.하지만 제가 의미하는 것은 아닙니다. developer.android.com/guide/topics/manifest/…
fikr4n

129

내 철학은 이것이다 :

절대적으로 필요한 경우에만 활동을 작성하십시오. 백 스택을 사용하여 조각 트랜잭션을 커밋 할 수있게되었으므로 앱에서 가능한 한 적은 활동을 만들려고합니다. 또한 여러 조각간에 통신하는 것이 활동간에 데이터를주고받는 것보다 훨씬 쉽습니다.

활동 전환이 비싸지 않습니까? 적어도 나는 그렇게 생각합니다-오래된 활동은 파괴 / 일시 중지 / 중지되고 스택에 푸시 된 다음 새로운 활동이 생성 / 시작 / 재개되어야하기 때문에.

프래그먼트가 소개 된 이래 그것은 단지 내 철학입니다.


2
사실, 그러나 당신이 쓴 것처럼 때로는 활동을 사용해야 할 때가 있습니다. 한 가지 예는 카메라 화면이며 가로 모드에서 사용하는 것이 좋습니다. 또 다른 예는 사용자 정의 된 appWidget을 배치 할 때 표시되는 구성 화면입니다 ( "데스크톱"-실행기 앱).
안드로이드 개발자

답변하고 경험을 공유해 주셔서 감사합니다. 따라서 응용 프로그램 아키텍처가 허용하는 경우 응용 프로그램을 하나의 활동으로 제한하고 모든 화면에 Fragment를 사용하는 것이 Android에서 좋은 습관이라고 생각하십니까?
Emil Adz

1
그렇다면 서로 "상태"를 전달해야하는 조각 문제를 어떻게 해결합니까? 모든 조각의 모든 상태는 하나의 활동에 있어야합니다. 그렇지 않으면 싱글 톤을 사용해야합니다.
Mr_E

36
여러 조각 사이의 통신이 활동간에 데이터를주고받는 것보다 훨씬 쉽다고 확신하지 않습니다.
Denny

3
적어도 onActivityResult()프래그먼트 콜백보다 안전하고 쉽습니다.
CoolMind

59

글쎄요, 구글의 강의에 따르면 ( 여기서는 기억이 나지 않을 것입니다), 코드를보다 쉽게 ​​관리하고 제어 할 수 있도록 가능할 때마다 프래그먼트 사용을 고려해야합니다.

그러나 조각을 호스팅하는 활동이 조각을 탐색 / 통신해야하기 때문에 경우에 따라 너무 복잡해질 수 있다고 생각합니다.

본인에게 가장 적합한 것을 스스로 결정해야한다고 생각합니다. 일반적으로 활동을 조각으로 변환하거나 그 반대로 변환하는 것은 어렵지 않습니다.

나는이 dillema에 대한 게시물을 만든 여기 당신은 몇 가지 더 읽기하고자하는 경우.


5
답변하고 경험을 공유해 주셔서 감사합니다. 따라서 응용 프로그램 아키텍처가 허용하는 경우 응용 프로그램을 하나의 활동으로 제한하고 모든 화면에 Fragment를 사용하는 것이 Android에서 좋은 습관이라고 생각하십니까?
Emil Adz

프로젝트에 따라 다르지만 너무 복잡하면 여러 활동으로 분리 할 수도 있습니다. 방법을 사용하는 것을 두려워하지 마십시오. 둘 다 사용할 수도 있습니다. 때로는 활동 대신 조각을 사용하기가 너무 어려울 수 있습니다. 난 당신이 조각을 사용하려고 노력하지만 너무 많이 당신의 방식으로 얻을 경우 그것을 어디에나 강제로하지 마십시오 ...
안드로이드 개발자

ActionBar의 영향을 그대로 유지하고 모든 내용을 바꾸려면 어떻게해야합니까? 활동으로 이것을 달성 할 수 있습니까?
Emil Adz


27

모든 사례에서 활동보다 조각을 선호하는 이유는 무엇입니까?

  • 활동은 비싸다. 프래그먼트에서는 뷰와 속성 상태가 분리되어 프래그먼트가에있을 때마다 backstack해당 뷰가 삭제됩니다. 따라서 액티비티보다 훨씬 많은 조각을 쌓을 수 있습니다.

  • Backstack시장 조작. 을 사용하면 FragmentManager모든 조각을 쉽게 지우고 조각 등보다 더 많이 삽입 할 수 있습니다. 그러나 활동의 경우, 그러한 것들을 조작하는 것은 악몽 일 것입니다.

  • 훨씬 예측 가능한 수명주기 . 호스트 활동이 재활용되지 않는 한. 백 스택의 조각은 재활용되지 않습니다. 따라서 FragmentManager::getFragments()특정 조각을 찾는 데 사용할 수 있습니다 (권장되지 않음).


안녕하세요, Frag over Act의 장점에 대한 귀하의 리뷰를 읽었습니다. Github Repo에서 동일하게 보여줄 프로젝트가 있습니까?
Ümañg ßürmån

24

이후 제트 팩 , 단일 활동 응용 프로그램은 선호하는 구조입니다. Navigation Architecture 구성 요소 와 함께 특히 유용합니다 .

출처


감사합니다!
Simão Garcia

1
오늘 Jetpack에 대해 처음 읽었습니다. :) 단편이 도입 된 이후 단일 활동 앱을 빌드합니다. 다중 활동은 훨씬 더 복잡합니다.
놀라운 1 월

1
@TheincredibleJan 당신은 맞습니다. 단일 활동 앱 아키텍처는 Jetpack 전에 훨씬 더 나은 솔루션이었습니다
Francis

12

내 의견으로는 그것은 실제로 관련이 없습니다. 고려해야 할 핵심 요소는

  1. UI의 일부 (예 : 메뉴)를 얼마나 자주 재사용합니까?
  2. 태블릿 용 앱입니까?

프래그먼트의 주요 용도는 멀티 패널 활동을 빌드하는 것이므로 태블릿 / 전화 반응 형 앱에 적합합니다.


조각의 주된 용도는 커스텀 뷰로 생각하지 않고 커스텀 뷰를 만드는 것입니다. 그것은 어쨌든 일어나는 일입니다. Google에서 원래 조각은 태블릿 반응 형 앱을 만드는 편리한 방법으로 표시되므로 원하는 경우 다른 활동에 적용 할 수 있습니다. 뷰에 코드를 어느 정도 첨부하고 원하는 위치에 고정 할 수있는 방법 (사용자 정의 뷰를 만들지 않고).
Lassi Kinnunen

11

액티비티는 인 텐트를 통해 공유하고 시작할 수있는 애플리케이션의 블록 / 컴포넌트임을 잊지 마십시오! 따라서 응용 프로그램의 각 활동은 한 가지 종류의 작업 만 해결해야합니다. 응용 프로그램에 하나의 작업 만 있으면 필요한 경우 하나의 활동과 많은 조각 만 필요하다고 생각합니다. 물론 다른 작업을 해결하는 향후 활동에서 조각을 재사용 할 수 있습니다. 이 접근 방식은 작업을 명확하고 논리적으로 분리합니다. 또한 여러 조각 집합에 대해 다른 의도 필터 매개 변수를 사용하여 하나의 활동을 유지할 필요가 없습니다. 요구 사항에 따라 개발 프로세스의 디자인 단계에서 작업을 정의합니다.


우리의 응용 프로그램에서 활동의 한 종류의 작업은 탐색 서랍을 잡고 다른 조각을 입력하는 것입니다. :) 왜 프래그먼트에 대한 의도로 그래야합니까? 글로벌 데이터에 대한 "글로벌"데이터 클래스에 대한 정적 참조를 보유하고 일부 값을 프래그먼트의 인스턴스 생성 메소드에 전달하는 것이 명확하고 논리적입니다.
놀라운 1 월

9

당신이 알고있는 것보다 더 많은 것이 있습니다. 시작된 활동이 암묵적으로 호출 활동을 파괴하지 않는 것보다 기억해야합니다. 물론, 사용자가 버튼을 클릭하여 페이지로 이동하여 해당 페이지의 활동을 시작하고 현재 활동을 파기하도록 설정할 수 있습니다. 이로 인해 많은 오버 헤드가 발생합니다. 내가 줄 수있는 가장 좋은 가이드는 다음과 같습니다.

** 주 활동과이 활동을 동시에 열어야하는 경우에만 새 활동을 시작하십시오 (여러 창을 생각하십시오).

여러 활동을하는 것이 좋은 경우의 좋은 예는 Google 드라이브입니다. 주요 활동은 파일 탐색기를 제공합니다. 파일을 열면 해당 파일을보기 위해 새로운 활동이 시작됩니다. 최근 앱 단추를 누르면 열린 문서를 닫지 않고 브라우저로 돌아간 다음 첫 번째 문서와 동시에 다른 문서를 열 수도 있습니다.


다시 "는 주요 활동과 동시에 (여러 개의 창을 생각)에 열이 하나를 가지고 의미가있는 경우에만 새로운 활동을 시작합니다." 나는 그렇게 생각하지 않습니다. 이 상황은 프래그먼트 attach / detach메소드를 사용하여 잘 해결됩니다 .
ToolmakerSteve

7

내가 한 일 : 가능하면 조각을 적게 사용하십시오. 불행히도 거의 모든 경우에 가능합니다. 그래서 나는 많은 조각과 약간의 활동으로 끝납니다. 내가 깨달은 몇 가지 단점 :

  • ActionBar& Menu : 2 개의 프래그먼트가 다른 타이틀, 메뉴를 가지면
    다루기가 어렵습니다. 예 : 새 조각을 추가 할 때 작업 표시 줄 제목을 변경할 수 있지만 팝업 backstack에서 이전 제목을 복원 할 방법이 없습니다. 이 경우 모든 조각에 툴바가 필요할 수 있지만 더 많은 시간을 소비하게 될 것입니다.
  • 우리가 필요로 할 때 startForResult활동은 있지만 단편은 없습니다.
  • 기본적으로 전환 애니메이션이 없습니다

이것에 대한 나의 해결책은 Activity를 사용하여 조각 을 감싸는 것입니다. 그래서 우리는 별도의 액션 바, 메뉴 startActivityForResult, 애니메이션을 가지고 있습니다 ...


1
매우 유용한 포인트입니다. 감사합니다. " 조각을 감싸는 활동 "을 명확히 할 수 있습니까 ? 각 조각에 대해 별도의 활동을 했습니까? 그렇다면 조각이 필요합니까?
ToolmakerSteve

3
제목과 물건을 복원하는 방법이 있습니다. getSupportFragmentManager().addOnBackStackChangedListener리스너를 추가하는 데 사용 합니다. 해당 청취자에서 현재 조각을 가져온 다음 제목과 내용을 설정하십시오.
babay

4

fragment오버 액티비티 의 가장 큰 장점 중 하나 는 프래그먼트에 사용되는 코드가 다른 액티비티에 사용될 수 있으므로 응용 프로그램 개발에서 코드의 재사용 성을 제공한다는 것 입니다.


3
어떻게? 예를 들어 주시겠습니까?
sofs1

1
@ sofs1 귀하의 질문은 의미가 없습니다. 프래그먼트의 코드는 프래그먼트가 어떤 활동에 영향을 미치는지에 관계없이 동일하게 유지됩니다.
놀라운 1 월

@TheincredibleJan 그러나 우리는 또한 "활동의 코드는 어떤 활동에서 두 번째 활동이 인스턴스화 되더라도 동일하게 유지됩니다."라고 말할 수 없었습니다. 차이가 보이지 않습니다.
iforce2d

3

에 대한 기본을 제공하는 응용 프로그램 당 하나 개의 활동 사용 fragment 용도 fragment, 스크린이 fragments있는 라이트 중량 에 비해 activites 단편이다 재사용 단편되어 더욱 적합 전화 및 태블릿 모두 지원 앱


2

당신은 그 중 하나를 자유롭게 사용할 수 있습니다.
기본적으로 앱에 가장 적합한 것을 평가해야합니다. 비즈니스 흐름을 관리하는 방법과 데이터 기본 설정을 저장 / 관리하는 방법에 대해 생각하십시오.

프래그먼트가 가비지 데이터를 저장하는 방법에 대해 생각하십시오. 프래그먼트를 구현할 때 프래그먼트로 채울 활동 루트가 있습니다. 따라서 조각이 너무 많은 많은 활동을 구현하려는 경우 두 개의 컨텍스트 수명주기를 조작 (거친 말)하는 앱의 성능을 고려해야합니다. 복잡성을 기억하십시오.

기억하십시오 : 조각을 사용해야합니까? 왜 안돼?

문안 인사.


1

더 나은 사용자 경험을 위해 조각을 사용합니다. 예를 들어 버튼이 있고 클릭 할 때 웹 서비스를 실행한다고 가정하면 조각을 부모 활동에 첨부합니다.

if (id == R.id.forecast) {

    ForecastFragment forecastFragment = new ForecastFragment();
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.main_content, forecastFragment);
    ft.addToBackStack("backstack");
    forecastFragment.setArguments(b);
    ft.commit();
}

이런 식으로 사용자는 다른 활동으로 이동할 필요가 없습니다.

둘째, 회전 중에 쉽게 처리 할 수 ​​있으므로 조각을 선호합니다.


이 예제를 더 나은 사용자 경험으로 만드는 이유는 무엇입니까? 그들은 활동이나 파편을하고 있다는 것을 어떻게 알 수 있습니까?
iforce2d

1

실제로 만들고 싶은 것에 달려 있습니다. 예를 들어, navigation drawer조각을 사용합니다. 탭도 사용 fragments합니다. 또 다른 좋은 구현은 listview. 전화를 돌리고 행을 클릭하면 화면의 나머지 절반에 활동이 표시됩니다. 개인적으로, 나는 사용 fragments하고 fragment dialogs더 전문으로. 또한 회전이 더 쉬워졌습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.