액티비티 대 프래그먼트는 몇 개입니까?


185

소개 :

기본 "Fragments Tutorial"패턴은 다음과 같습니다.

  1. 태블릿에서는 왼쪽에 목록이 있고 오른쪽에 세부 정보가 있습니다.
  2. 둘 다 Fragments동일하게 존재합니다 Activity.
  3. 전화 Fragment에서 하나 의 목록 을 만드십시오 Activity.
  4. Activity세부 사항을 가진 새로운를 시작합니다 Fragment.

(예 : Dianne Hackborn의 Android 3.0 Fragments APIFragments API 안내서 )

두 장치 모두에서 기능은에 있습니다 Fragments. (단순한)

태블릿 , 전체 응용 프로그램입니다 (1)Activity 온, 전화 , 거기에 많은Activities .


질문 :

  • 전화 앱을 여러 가지로 나눌 이유가 Activities있습니까?

이 방법의 한 가지 문제 는 기본 태블릿 과 별도의 전화에서 많은 논리복제 한다는 것 입니다.ActivityActivities

  • 두 경우 모두 동일한 Fragments배치 및 전환 논리를 사용하여 (다른 레이아웃을 사용하여) 1 Activity 모델을 유지하는 것이 더 쉽지 않습니까?

이러한 방식으로 대부분의 논리가 Fragments자체적으로 존재 Activity하며 코드 중복이 한 번도 줄어 듭니다.

또한 내가 읽은 ActionBarSherlock것은 Fragments대신에 가장 잘 작동하는 것 같습니다 Activities(그러나 아직 작업하지는 않았습니다).

튜토리얼이 지나치게 단순화되었거나이 접근법에서 중요한 것을 놓친 적이 있습니까?


우리는 사무실에서 두 가지 접근 방식을 모두 성공적으로 시도했지만 더 큰 프로젝트를 시작하려고하며 가능한 한 쉽게 만들려고합니다.

관련 질문에 대한 링크 :


업데이트

질문에 대한 현상금이 시작되었지만 태블릿 활동과 각 전화 활동에서 왜 앱 로직을 복제해야하는지 확신하지 못했습니다.

또한 Square의 사람들이 읽은 흥미로운 기사를 찾았습니다.


38
훌륭하고 잘 쓰여진 질문에 +1
Siddharth Lele

그것은 오늘 날 많이 아프게하는 것입니다. 현재 디자인이 많은 조각을 포함하고 휴대 전화와 태블릿 모두에서 사용할 수있는 응용 프로그램을 작성 중입니다. 중간 방법을 찾고 있지만 아직 찾을 수 없었습니다. ...
Nixit Patel

1
나는 정직하게 범죄를 의미하지는 않지만 실제 답변보다는 듣고 싶은 것을 받아 들였다고 생각합니다. 스쿠버의 답변은 Google에서 권장하지 않으며 이유를 설명하는 블로그 게시물이 좋습니다.
pjco

1
@ pjco 특히 나는 onItemSelected()활동에 방법 을 갖는 것에 동의하지 않는다 . "실제"앱에는 많은 목록과 하위 목록이 있습니다. 이 패턴은 내 탭 활동에 onItemSelected()각 목록을 처리 하는 방법이 있어야 함을 나타 냅니다. 또한 전화 활동에는 각각 동일한 논리가 중복되어 있어야합니다. IMHO 각 조각에 항목 선택 논리를 넣는 것이 훨씬 좋습니다. 중복이 없으며 코드를 구성하는 방식을 선호합니다. 난이 도움이 되었으면 좋겠
리처드 르 Mesurier을

2
나는 현재 직장에서이 딜레마에 매달렸다. 조각은 새로운 활동을 시작하는 것보다 훨씬 빨리 로드 되므로 단일 활동 아키텍처를 구현하기 시작했습니다. 그래도 문제가 발생하여 해킹을하지 않고 다중 조각 구성을 지원하는 좋은 방법을 찾지 못하는 것 같습니다. 이 질문을 참조하십시오 .
theblang

답변:


41

튜토리얼이 매우 간단하다는 데 동의합니다. 그들은 단지 소개 Fragments하지만 제안 된 패턴에 동의하지 않습니다.

또한 많은 활동에 걸쳐 앱의 논리를 복제하는 것은 좋지 않다는 데 동의합니다 ( wikipedia의 DRY 원칙 참조 ).


ActionBarSherlockFragments Demo 앱 에서 사용하는 패턴을 선호합니다 ( 여기소스 코드 다운로드 ). 질문에서 언급 한 튜토리얼과 가장 일치하는 데모는 앱에서 "레이아웃"이라는 데모입니다. 또는 FragmentLayoutSupport소스 코드에서.

이 데모에서는 논리가에서 Activity및로 이동되었습니다 Fragment. 은 TitlesFragment실제로 조각을 변경하는 로직을 포함하고 있습니다. 이런 식으로 각 활동은 매우 간단합니다. 활동에 논리가없는 많은 간단한 활동을 복제하면 매우 간단합니다.

논리를 프래그먼트에 넣으면 코드를 두 번 이상 쓸 필요없습니다 . 프래그먼트가 어떤 액티비티에 놓이든지 상관없이 사용할 수 있습니다. 이것은 기본 튜토리얼에서 제안한 것보다 더 강력한 패턴을 만듭니다.

    /**
    * Helper function to show the details of a selected item, either by
    * displaying a fragment in-place in the current UI, or starting a
    * whole new activity in which it is displayed.
    */
    void showDetails(int index)
    {
        mCurCheckPosition = index;

        if (mDualPane)
        {
            // We can display everything in-place with fragments, so update
            // the list to highlight the selected item and show the data.
            getListView().setItemChecked(index, true);

            // Check what fragment is currently shown, replace if needed.
            DetailsFragment details = (DetailsFragment) getFragmentManager()
                .findFragmentById(R.id.details);
            if (details == null || details.getShownIndex() != index)
            {
                // Make new fragment to show this selection.
                details = DetailsFragment.newInstance(index);

                // Execute a transaction, replacing any existing fragment
                // with this one inside the frame.
                FragmentTransaction ft = getFragmentManager()
                    .beginTransaction();
                ft.replace(R.id.details, details);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                ft.commit();
            }

        }
        else
        {
            // Otherwise we need to launch a new activity to display
            // the dialog fragment with selected text.
            Intent intent = new Intent();
            intent.setClass(getActivity(), DetailsActivity.class);
            intent.putExtra("index", index);
            startActivity(intent);
        }
    }

ABS 패턴 의 또 다른 장점은 많은 로직을 포함하는 태블릿 활동으로 끝나지 않으며 메모리를 절약한다는 것입니다. 튜토리얼 패턴은 더 복잡한 앱에서 매우 큰 주요 활동으로 이어질 수 있습니다. 언제든 배치되는 모든 조각의 논리를 처리해야하기 때문입니다.

전반적으로 많은 활동을 강요받는 것으로 생각하지 마십시오. 코드를 여러 조각으로 나누고 사용할 때 메모리를 절약 할 수있는 기회라고 생각하십시오.


포괄적 인 답변을위한 thx-ABS 데모를 살펴 보았으며 거기에 좋은 코드가 많이 있다고 생각합니다. 내가 대신 조각으로 내 논리의 대부분을 이동하려고합니다
리처드 르 Mesurier에게

데모 응용 프로그램이 여기로 이동 : play.google.com/store/apps/…
Philipp E.

나는 당신이 묘사하는 패턴이 원래 Google 샘플 코드 인 android-developers.blogspot.com/2011/02/에서 온 것 같습니다 ... ActionBarSherlock은 방금 Google 데모 코드를 ABS 클래스를 사용하도록 포팅했다고 생각합니다.
Dan J

17

당신이 올바른 길을 가고 있다고 생각합니다. (예, 튜토리얼이 지나치게 단순화되었습니다).

태블릿 레이아웃에서는 단일 액티비티를 사용하고 프래그먼트를 여러 '창'으로 교체 할 수 있습니다. 전화 레이아웃에서 각 조각에 대해 새 활동을 사용할 수 있습니다.

이렇게 :

여기에 이미지 설명을 입력하십시오

많은 추가 작업처럼 보일 수 있지만 전화에 여러 활동을 사용하면 기본 활동 라이프 사이클 및 의도 전달을 사용할 수 있습니다. 또한 프레임 워크에서 모든 애니메이션과 백 스택을 처리 할 수 ​​있습니다.

코드를 줄이려면 a를 사용하여 BaseActivity확장 할 수 있습니다 .

따라서 사용자에게 태블릿이 있다면 사용 MyMultiPaneFragActivity하거나 비슷한 것을 사용하십시오 . 이 액티비티는 프래그먼트에서 콜백을 관리하고 검색 의도와 같은 올바른 프래그먼트로 라우팅 의도를 관리합니다.

사용자에게 전화가있는 경우 코드가 거의없는 일반 활동을 사용하여 확장 MyBaseSingleFragActivity하거나 이와 유사한 것을 수행 할 수 있습니다. 이러한 활동은 5-10 줄의 코드 (아마도 더 적을 수 있음) 일 수 있습니다.

까다로운 부분은 라우팅 의도와 그렇지 않은 것입니다. * (편집 : 자세한 내용은 아래 참조).

이것이 권장되는 방법은 메모리를 절약하고 복잡성과 결합을 줄이는 것입니다. 프래그먼트를 교체하는 FragmentManager경우 백 스택의 해당 프래그먼트에 대한 참조가 유지됩니다. 또한 사용자에게 무엇이 '실행'되어야 하는지를 단순화합니다. 이 설정은 또한 조각의 뷰와 레이아웃 및 논리를 활동 라이프 사이클과 분리합니다. 이 방법으로 단편은 단일 활동, 다른 단편 (2 창) 또는 3 창 활동 등에 존재할 수 있습니다.

* 정기적 인 텐트 라우팅의 이점 중 하나는 백 스택의 어느 곳에서나 활동을 명시 적으로 시작할 수 있다는 것입니다. 하나의 예가 검색 결과의 경우 일 수 있습니다. (MySearchResults.class).

자세한 내용은 여기를 읽으십시오.

http://android-developers.blogspot.com/2011/09/preparing-for-handsets.html

각 프래그먼트가 별도의 활동에서 잘 작동해야하기 때문에 조금 더 선행 작업 일 수 있지만 일반적으로 효과가 있습니다. 즉, 다양한 프래그먼트 조합을 정의하고 프래그먼트 코드를 모듈 식으로 유지하며 작업 표시 줄 관리를 단순화하고 시스템이 모든 백 스택 작업을 처리하도록하는 대체 레이아웃 파일을 사용할 수 있습니다.


MySearchResults의 장점을 다시 생각해보십시오. 핸드셋이나 태블릿에 따라 다른 의도로 응답하는 것이 좋습니다. 두 경우 모두에 반응하는 단일 활동을하는 것보다 더 나은 이유는 무엇입니까? 태블릿에는 정기적 인 의도 라우팅이 없으므로 태블릿의 문제를 해결해야합니다. 핸드셋에서도 해당 솔루션을 사용하지 않겠습니까?
Richard Le Mesurier

여기서 장점은 태블릿 코드가 여러 창으로 라우팅 될 수 있다는 것입니다. 때로는 단일 의도로 여러 창을 변경하려고 할 수도 있습니다. 왼쪽의 검색 결과와 같이 큰 창에서 첫 번째 항목이 오른쪽에 표시됩니다. 이 코드는 단일 레이아웃으로 이식 할 수 없습니다.
pjco

조각이 많을 때 조각을 전환해도되는 이유는 무엇입니까? 단 하나의 조각 만 보이는 경우 다른 조각으로 전환하지 않아야합니까?
Richard Le Mesurier

무슨 뜻인지 이해하지 못하지만 위의 의견을 분명히하기 위해 : 때로는 여러 조각 레이아웃에서 동시에 두 개 이상의 조각을 변경하고 싶을 수도 있습니다. 이를 위해서는 단일 조각 레이아웃에서 재사용하지 않을 코드를 2 개의 조각으로 변경해야합니다.
pjco

당신은 환영합니다 :) 답이 도움이된다고 생각되면 공감하거나 수락하십시오
pjco

6

여기에서 가져온 동일한에 대한 레토 마이어의 대답이며, 이 비디오Udacity의 안드로이드 기본 코스 .

앱을 여러 활동으로 나누는 것이 더 좋은 이유는 여러 가지가 있습니다.

  • 단일 모 놀리 식 활동이 있으면 코드의 복잡성이 증가하여 읽기, 테스트 및 유지 관리가 어려워집니다.
  • 인 텐트 필터 생성 및 관리를 훨씬 어렵게 만듭니다.
  • 독립 구성 요소를 단단히 결합 할 위험이 높아집니다.
  • 단일 활동에 민감한 정보와 안전하게 공유 할 수있는 정보가 모두 포함되어 있으면 보안 위험이 발생할 가능성이 훨씬 높아집니다.

경험상 상황이 바뀔 때마다 새로운 활동을 작성하는 것이 좋습니다. 예를 들어, 다른 종류의 데이터를 표시하고보기에서 데이터 입력으로 전환하는 동안.


흥미롭게도 비디오의 제목은 "우리는 왜 조각을 사용하지 않는가?"
Richard Le Mesurier

그것은 좋은 접근 방법입니다, 단일 활동 여러 조각으로 수많은 문제에 직면하고 있습니다 ... 실제
경험

4

이 방법의 한 가지 문제점은 기본 태블릿 활동과 별도의 전화 활동에서 많은 논리를 복제한다는 것입니다.

마스터-디테일 패턴에는 두 가지 활동이 있습니다. 하나는 큰 화면에서는 조각과 작은 화면에서는 "마스터"조각 만 보여줍니다. 다른 하나는 더 작은 화면에서 "세부 사항"조각을 보여줍니다.

세부 논리는 세부 조각에 묶여 있어야합니다. 따라서 활동 사이의 세부 논리와 관련된 코드 복제가 없습니다. 세부 활동은 단순히 세부 조각을 표시하여 Intent추가 데이터에서 데이터를 전달 합니다.

또한 ActionBarSherlock에 대해 읽은 것은 활동 대신 조각과 가장 잘 작동하는 것 같습니다 (그러나 아직 작업하지는 않았습니다).

ActionBarSherlock은 순수하게 기본 작업 표시 줄의 백 포트이므로 ActionBarSherlock은 기본 작업 표시 줄보다 조각과 더 이상 관련이 없습니다.


단일 활동에 대한 당신의 생각은 무엇입니까?
theblang

@ mattblang : 탐색을 올바르게 수행하는 한 아무런 문제가 없습니다.
CommonsWare

1
조각을 교체하는 것이 동일한 조각으로 새로운 활동을 시작하는 것보다 훨씬 빠르기 때문에 단일 활동 아키텍처로 리팩토링을 시도했습니다. 내가 좋아하는,하지만 너무 많은 그루터기에 실행하고 같은 느낌 . 온라인에서 찾은 대부분의 예, 특히 master-detail과 같은 다중 조각 구성의 경우 단일 활동을 사용하지 마십시오. 그래서 나는 약간의 딜레마에 있습니다.
theblang

0

"전화 앱을 여러 활동으로 나눌 이유가 있습니까?"의 첫 번째 질문을 참조하십시오. - 예. 사용 가능한 공간으로 간단히 넘어가므로 태블릿은 개발자에게 더 많은 공간을 제공하므로 개발자가 한 화면에 더 많은 공간을 배치 할 수 있습니다. 안드로이드는 활동이 화면을 제공 할 수 있다고 알려줍니다 . 따라서 태블릿에서 하나의 큰 화면으로 할 수있는 것은 모든 조각을위한 공간이 충분하지 않기 때문에 전화기의 여러 화면에 확산되어야 할 수도 있습니다.


첫 번째 문장- "활동은 사용자가 무언가를하기 위해 상호 작용할 수 있는 화면제공 하는 응용 프로그램 구성 요소입니다 ". 원래 진술에 오류가 표시되는 경우 "다른 화면이 있습니다"라는 의미는 아닙니다.
EFlisio
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.