왜 조각 대신 활동 대신 조각을 사용해야합니까?


484

Android API 11+에서 Google은이라는 새로운 클래스를 출시했습니다 Fragment.

동영상에서 Google은 가능한 경우 ( link1 , link2 ) 활동 대신 조각을 사용해야한다고 제안 하지만 정확한 이유는 설명하지 않았습니다.

프래그먼트의 목적과 프래그먼트의 가능한 용도는 무엇입니까 (단순한 뷰 / 레이아웃으로 쉽게 달성 할 수있는 일부 UI 예제 제외)?

내 질문은 조각에 관한 것입니다.

  1. 프래그먼트를 사용하는 목적은 무엇입니까?
  2. 액티비티 / 뷰 / 레이아웃을 사용하는 것과 비교하여 프래그먼트를 사용하는 것의 장점과 단점은 무엇입니까?

보너스 질문 :

  1. 조각에 정말 흥미로운 용도를 줄 수 있습니까? Google이 동영상에서 언급하지 않은 것들?
  2. 프래그먼트와 프래그먼트가 포함 된 활동간에 통신하는 가장 좋은 방법은 무엇입니까?
  3. 프래그먼트를 사용할 때 기억해야 할 가장 중요한 것은 무엇입니까? 경험에 대한 팁과 경고가 있습니까?


답변:


282

# 1 & # 2 조각을 사용하는 목적은 무엇입니까? 활동 / 조회 / 레이아웃을 사용하는 것과 비교하여 조각을 사용하는 장점과 단점은 무엇입니까?

단편은 재사용 가능한 사용자 인터페이스를 작성하기위한 Android 솔루션입니다. 액티비티 및 레이아웃을 사용하여 (예를 들어 포함을 사용하여) 동일한 작업을 수행 할 수 있습니다. 하나; 프래그먼트는 HoneyComb에서 Android API에 연결되어 있습니다. 정교하게하겠습니다.

  • ActionBar. 탭을 통해 앱을 탐색하려는 경우 ActionBar.TabListener인터페이스가 메소드 FragmentTransaction의 입력 인수로 제공 된다는 것을 금방 알 수 있습니다 onTabSelected. 아마도 이것을 무시하고 다른 일을 할 수 있지만 영리하지는 않지만 API에 대해 작업하고 있습니다.

  • FragmentManager매우 영리한 방법으로 당신을 위해 핸들«뒤로». 뒤로가는 것은 일반 활동과 같이 마지막 활동으로 돌아가는 것을 의미하지 않습니다. 다시 이전 조각 상태로 돌아갑니다.

  • ViewPagera와 함께 cool 을 사용하여 FragmentPagerAdapter스 와이프 인터페이스를 만들 수 있습니다. FragmentPagerAdapter코드는 일반 어댑터보다 훨씬 깨끗하고, 개별 조각의 인스턴스화를 제어합니다.

  • 휴대폰과 태블릿 모두에 응용 프로그램을 만들려고 할 때 Fragments를 사용하면 인생이 훨씬 쉬워집니다. 프래그먼트는 Honeycomb + API와 매우 밀접하게 연관되어 있기 때문에 코드를 재사용하기 위해 전화기에서도 사용하고 싶을 것입니다. 호환성 라이브러리가 유용한 곳입니다.

  • 휴대 전화 전용 앱에 대해 조각을 사용할 수도 있고 사용해야합니다. 휴대 성을 염두에 둔다면. 내가 사용 ActionBarSherlock하고 호환성 라이브러리 버전 1.6 같은 모든 방법의 뒷면을 보면 애플 리케이션을 "보고 ICS"를 만들 수 있습니다. ActionBar탭, 오버플로, 분할 작업 표시 줄,보기 호출기 등 의 최신 기능을 사용할 수 있습니다 .

보너스 2

조각간에 통신하는 가장 좋은 방법은 의도입니다. 프래그먼트에서 무언가를 누르면 일반적으로 그 StartActivity()위에 데이터가 있습니다. 의도는 시작한 활동의 ​​모든 조각으로 전달됩니다.


5
우선, 고맙습니다. 나는 유익한 (아직 짧은) 답변을 제공하는 사람들에게 감사하고 매뉴얼에 대한 링크를 제공하지 않습니다. 어쨌든 특수 클래스에서 작업 할 수있는 추가 기능 외에도 조각 작업에 대한 장단점 ?
안드로이드 개발자

4
나는 당신이 더 직접적으로 질문해야한다고 생각합니다. 위의 네 가지 주요 이점을 제공했습니다.
Glenn Bech

2
좋아, 사용자 정의보기 및 활동과 비교하여 단점은 무엇입니까?
안드로이드 개발자

2
인 텐트를 사용하여 프래그먼트간에 어떻게 통신합니까? 모든 조각이 서로 통신 할 수 있도록 "활동"에 추가되어야합니까 (활동에 추가)?
안드로이드 개발자

55
한 조각은 다른 조각과 직접 대화해서는 안됩니다. 대신 부모 활동을 수행하십시오. 이렇게하면 스파게티 코드가 아니라 코드를 쉽게 관리 할 수 ​​있습니다.
slott

70

어떤 비디오를 언급하고 있는지 확실하지 않지만 직접 교환 할 수 없기 때문에 활동 대신 조각을 사용해야한다고 말하고 있습니다. 실제로 Dev Guide 에는 상당히 자세한 항목 이 있으므로 자세한 내용을 읽어보십시오.

간단히 말해서 조각은 활동 내부에 있으며 각 활동은 많은 조각을 호스팅 할 수 있습니다. 액티비티와 마찬가지로 특정 라이프 사이클이 있으며 액티비티와 달리 최상위 응용 프로그램 구성 요소가 아닙니다. 프래그먼트의 장점은 멀티 패널 인터페이스를 구축하는 기능 (대부분 태블릿에 유용함)을 포함하여 코드 재사용 및 모듈화 (예 : 많은 활동에서 동일한 목록보기 사용)를 포함합니다. 주요 단점은 (일부) 복잡성이 추가된다는 것입니다. 일반적으로 비표준적이고 덜 견고한 방식으로 (사용자 정의)보기로 동일한 것을 얻을 수 있습니다.


1
질문이 업데이트되었습니다. 이제 Google 비디오에 대한 링크가 있습니다. 또한 설명 주셔서 감사하지만 여전히 내 질문에 대한 설명이 필요합니다.
안드로이드 개발자

5
개발자 가이드 항목을 읽으십시오. 세부 정보가 충분합니다. SO의 '멋진 조각 사용'에 대한 답변을 모호하게 만드는 방법은 거의 없으며 단일 답변도 없습니다. 번호 4 specificlly dev에 guide--에 대한 답변 developer.android.com/guide/topics/fundamentals/...
니콜라이 Elenkov에게

1
내가 아는 한,이 방법은 어떤 활동이 어떤 조각을 포함 할 수 있는지에 대한 종속성을 만듭니다. 또한 주요 질문에 답하십시오 (처음 두 개).
안드로이드 개발자

3
기본 질문에 대한 답변을 요청한 Android 개발자에게 감사합니다. ATM 나는 XML "include"태그를 사용하는 것보다 Fragment 클래스에서 유용한 것을 보지 못했다. 내가 소중하게 생각하는 것들은 모든 해상도에서 최고의 사용자 경험으로 마술처럼 변형 될 하나의 레이아웃을 지정할 수있는 능력 일 것입니다. 내가 알 수 있듯이 여전히 코드로 직접해야합니다. 또 다른 잠재적 가치는 재사용 응용 프로그램에서 찾을 수 없지만 재사용 가능한 구성 요소에 코드 + 리소스를 번들로 묶는 방법입니다. 정말 좋은 이유가 하나 있습니다.
Melinda Green

2
나는 구글이 조각을 사용하는 것이 좋습니다 방법을 이해하기 시작 해요,하지만 난 상당히 나에게 .. @NikolayElenkov에 동의, 활동은 여전히 가장 강력하고 덜 복잡한 방법이 될 것으로 보인다 사용 ..
andrea.rinaldi

49

조각은보다 모듈화 된 활동 설계를 가능하게하는 활동에 배치 될 수있는 응용 프로그램의 사용자 인터페이스 또는 동작의 일부입니다. 프래그먼트가 일종의 하위 활동이라고 말하면 잘못되지 않습니다.

다음은 조각에 대한 중요한 사항입니다.

  1. 프래그먼트에는 자체 레이아웃과 자체 수명주기 콜백이있는 자체 동작이 있습니다.

  2. 활동이 실행되는 동안 활동에서 단편을 추가하거나 제거 할 수 있습니다.

  3. 단일 활동에서 여러 조각을 결합하여 다중 창 UI를 만들 수 있습니다.

  4. 단편은 여러 활동에서 사용될 수 있습니다.

  5. 프래그먼트 수명주기는 호스트 활동의 수명주기와 밀접한 관련이 있습니다.

  6. 활동이 일시 정지되면 활동에 사용 가능한 모든 프래그먼트도 중지됩니다.

  7. 조각은 사용자 인터페이스 구성 요소가없는 동작을 구현할 수 있습니다.

  8. API 버전 11의 Android 3 (Honeycomb) 에서 Android API에 단편이 추가되었습니다 .

자세한 내용은 공식 사이트 인 Fragments 를 방문하십시오 .


1. # 8에서 언급했듯이 레이아웃이 필요하지 않습니다. 6. "의미"후 부분을 놓쳤다. 어쨌든 다른 사람들이 이것을 더 명확하게하도록 도와 주셔서 감사합니다. 나는 당신에게 +1을 줄 것이다.
안드로이드 개발자

1
# 8과 관련하여 레이아웃없는 조각 (예 : 'headless'조각)의 가능한 예는 구성 변경 사항을 유지하기 위해 다소 짧은 (예 : 짧은 HTTP 요청)에도 불구하고 여전히 작업을 수행하는 작업입니다. 조각에서 setRetainInstance (true)를 사용하여 전체 조각 인스턴스에서 보존됩니다. 레이아웃 프래그먼트의 경우, setRetainInstance (true)는 필요한 경우 뷰와 관련된 리소스가 해제되는 것을 방지하므로 (예 : 메모리 누수) 의미가 없습니다.
Piovezan

참고 : "# 8"은 이제 "# 7"입니다.
ToolmakerSteve

21

이것은 조각에서 찾은 중요한 정보입니다.

역사적으로 Android 앱의 각 화면은 별도의 활동으로 구현되었습니다. 안드로이드 인 텐트 메커니즘은 액티비티간에 직접 참조 유형 (예 : 객체)을 전달할 수 없기 때문에 화면간에 정보를 전달하는 데 어려움이 있습니다. 대신 객체를 직렬화하거나 전역 적으로 액세스 가능한 참조를 사용할 수 있어야합니다.

각 화면을 별도의 조각으로 만들어이 데이터 전달 두통을 완전히 피할 수 있습니다. 조각은 항상 주어진 활동의 컨텍스트 내에 존재하며 항상 해당 활동에 액세스 할 수 있습니다. 활동 내에서 관심있는 정보를 저장함으로써 각 화면의 조각은 단순히 활동을 통해 객체 참조에 액세스 할 수 있습니다.

출처 : https://www.pluralsight.com/blog/software-development/android-fragments


3
그것은 사실이지만, 이것에 대한 해결책이 있습니다 : 거대한 객체가 아닐 때 Parcelable을 사용하십시오 (더 쉽게 만들 수있는 플러그인이 있습니다). 그리고 거대한 객체 인 경우 항상 null로 설정되는 정적 참조를 사용할 수 있습니다 새로운 활동에 도달 할 때 (또는 요구 사항에 따라 파괴 할 때).
안드로이드 개발자

@androiddeveloper : "use Parcelable"은 "Fragments를 사용하여 피할 수있는 데이터 전달 두통"에 대한 나의 정의에 적합합니다. 일련의 화면이 통과하는 동안 지속해야하는 복잡한 공유 상태가있는 경우 Activity + Fragments가 좋은 솔루션입니다 (IMHO). (하지만 Fragment back stack을 버리고 "back"의 의미를 직접 관리했습니다.)
ToolmakerSteve

컨테이너 활동을 통해 프래그먼트 간 인터페이스 디자인 패턴을 사용하는 것은 객체뿐만 아니라 클릭 이벤트 리스너 및 메소드 인수를 다른 프래그먼트 또는 기본 컨테이너 활동으로 전달하는 모듈 방식입니다.
Kaveesh Kanwal

10

액티비티는 툴바가있는 앱의 전체 화면 구성 요소이며, 그 밖의 모든 요소는 조각입니다. 도구 모음이있는 하나의 전체 화면 상위 활동에는 여러 개의 분할 창, 스크롤 가능한 페이지, 대화 상자 등 (모든 조각)이있을 수 있으며,이 모두는 상위에서 액세스하고 상위를 통해 통신 할 수 있습니다.

예:

활동 A, 활동 B, 활동 C :

  • 예를 들어 기본 도구 모음을 표시하거나 부모 활동을 상속하려면 모든 활동에 동일한 코드를 반복해야합니다 (관리하기가 번거 로움).
  • 한 활동에서 다른 활동으로 이동하려면 모든 활동이 메모리에 있거나 (오버 헤드) 다른 활동을 열려면 다른 활동을 파괴해야합니다.
  • 활동들 간의 의사 소통은 의도를 통해 이루어질 수 있습니다.

vs

활동 A, 단편 1, 단편 2, 단편 3 :

  • 코드 반복이 없으며 모든 화면에는 해당 활동의 툴바 등이 있습니다.
  • 한 조각에서 다음 조각으로 이동하는 여러 가지 방법-보기 호출기, 다중 창 등
  • 활동에는 대부분의 데이터가 있으므로 조각 간 통신이 최소화되어야합니다. 여전히 필요한 경우 인터페이스를 통해 쉽게 수행 할 수 있습니다.
  • 단편은 전체 화면 일 필요는 없으며 설계시 유연성이 뛰어납니다.
  • 뷰가 필요하지 않은 경우 조각은 레이아웃을 팽창시킬 필요가 없습니다.
  • 여러 활동에서 동일한 조각을 사용할 수 있습니다.

완벽한 답변!
사테 쉬

8

조각은 모든 페이지에 탐색 창을 유지하려는 경우와 같이 일부 경우에 특히 유용합니다. 원하는 프래그먼트로 프레임 레이아웃을 팽창시킬 수 있으며 여전히 탐색 드로어에 액세스 할 수 있습니다.

활동을 사용한 경우 중복 코드를 작성하는 모든 활동에 드로어를 보관해야합니다. 이것은 단편의 흥미로운 사용 중 하나입니다.

저는 Android를 처음 사용하지만 여전히 조각이 도움이 될 것이라고 생각합니다.


예. 그러나 여전히 조각을 사용하는 올바른 방법에 대해 혼란스러워하며 조각과 활동의 복잡한 수명주기 때문입니다.
안드로이드 개발자

@androiddeveloper 주로 활동을 사용합니까?
Michael Alan Huff

@MichaelAlanHuff 태블릿을 지원할 때 Fragments를 사용하는 것이 좋습니다. 방향 변경 및 기타 유사한 이벤트를 지원하는 때 당신이 그들을 복원 할 수 있습니다으로 또한, 당신은, DialogFragment을 사용할 수 있습니다
안드로이드 개발자

@androiddeveloper, 그게 내가 생각하는 것입니다. DialogFragments를 자주 사용하지 않았습니다. 논리의 모듈화를 돕기 위해 많은 안드로이드 개발자들이 사용자 정의 뷰를 사용하여 논리를 박격포로 유지하기 시작했습니다. 다음은 에어 비앤비에서 엔지니어에 의해 주어진 사용자 정의보기에 대한 최근의 이야기입니다 vimeo.com/127799187
마이클 앨런 허프

현재 화면이 다른 화면의 일부가 될 수 있다고 생각되면 조각을 사용하는 @MichaelAlanHuff도 유용 할 수 있습니다.
Android 개발자

5

나는 이것이 이미 죽음에 대해 논의되었다는 것을 알고 있지만 몇 가지 점을 더하고 싶습니다.

  • 조각을 사용하여을 채우고 클릭을 직접 Menu처리 할 수 ​​있습니다 MenuItem. 따라서 활동에 대한 추가 변조 옵션을 제공합니다. ContextualActionBar 작업 등을 Activity에 대해 알지 않고도 수행 할 수 있으며 기본적으로 Activity가 처리하는 기본 항목 (Navigation / Settings / About)과 분리 할 수 ​​있습니다.

  • 하위 프 래그가있는 상위 프 래그는 구성 요소를 변조 할 수있는 추가 옵션을 제공 할 수 있습니다. 예를 들어 Frag를 쉽게 교체하고, 새로운 Frag를 Pager 내부에 넣거나 제거하고, 재 배열 할 수 있습니다. 당신의 활동이없는 모든 것은 단지 높은 수준의 물건에 초점을 맞추고 있습니다.


0

프래그먼트는 액티비티 내에 존재하며

  • 자체 수명주기
  • 자체 레이아웃
  • 자체 자식 조각 등

프래그먼트를 자신이 속한 주 활동의 하위 활동으로 생각하면, 자체 활동이 존재할 수 없으며 반복해서 호출 / 재사용 할 수 있습니다. 도움이 되었기를 바랍니다 :)


실제로, 두 번째 포인트 ( "자체 레이아웃")에 대해서는 선택 사항입니다. 조각은 전혀 볼 필요가 없습니다.
Android 개발자

0

1. 프래그먼트를 사용하는 목적은 무엇입니까?

  • 답변 :
    1. 장치 폼 팩터 차이 다루기
    2. 앱 화면간에 정보 전달
    3. 사용자 인터페이스 조직.
    4. 고급 UI 비유.

0

프래그먼트는 액티비티 내부에 있으며 액티비티는 그 자체로 존재합니다.


6
"자체"? 아마도 "자체적으로"? 아니면 "그 자체로"?
Peter Mortensen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.