액티비티 대 프래그먼트는 몇 개입니까? 소개 : 기본 “Fragments Tutorial”패턴은 다음과

소개 :

기본 “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의 사람들이 읽은 흥미로운 기사를 찾았습니다.



답변

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

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


답변

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

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

이렇게 :

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

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

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

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

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

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

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

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

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

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


답변

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

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

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

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


답변

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

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

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

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

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


답변

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