뷰가 아닌 Android에서 프래그먼트를 사용하면 어떤 이점이 있습니까?


102

을 (를) 개발할 때 Android대상 (또는 최소) sdk를 4 (API 1.6)로 설정하고 Android 호환성 패키지 (v4)를 추가하여 Fragments. 어제이 작업을 수행 Fragments하고 사용자 지정 클래스의 데이터를 시각화하기 위해 성공적으로 구현 했습니다.

내 질문은 이것이다 : Fragments단순히 사용자 지정 개체에서보기를 가져오고 여전히 API 1.5를 지원하는 것과 반대로 사용하면 어떤 이점이 있습니까?

예를 들어 Foo.java 클래스가 있다고 가정합니다.

public class Foo extends Fragment {

    /** Title of the Foo object*/
    private String title;
    /** A description of Foo */
    private String message;

    /** Create a new Foo
     * @param title
     * @param message */
    public Foo(String title, String message) {
        this.title = title;
        this.message = message;
    }//Foo

    /** Retrieves the View to display (supports API 1.5. To use,
     * remove 'extends Fragment' from the class statement, along with
     * the method {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}) 
     * @param context Used for retrieving the inflater */
    public View getView(Context context) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(R.layout.foo, null);
        TextView t = (TextView) v.findViewById(R.id.title);
        t.setText(this.title);
        TextView m = (TextView) v.findViewById(R.id.message);
        m.setText(this.message);
        return v;
    }//getView 

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (container == null) {
            return null;
        }
        View v = inflater.inflate(R.layout.foo, null);
        TextView t = (TextView) v.findViewById(R.id.title);
        t.setText(this.title);
        TextView m = (TextView) v.findViewById(R.id.message);
        m.setText(this.message);
        return v;
    }//onCreateView

}//Foo

두 가지 방법 모두 표시 할 액티비티 List<Foo>(예 :에 각각을 프로그래밍 방식으로 추가) 가있는 액티비티에서 생성하고 작업하는 것이 매우 간단합니다 ScrollView. 따라서 Fragments정말 유용하거나 지나치게 단순화 된 것입니다. 위의 코드를 통해보기를 얻습니까?


2
프래그먼트는 UI를 가질 필요가 없으며 재사용 가능한 동작 일 수 있습니다. 이 경우 View는 중복됩니다.
Philipp Reichart

나는 이것에 다른 질문에 대답했다. stackoverflow.com/a/14912608/909956을 참조하십시오 . T; dr-때때로 조각을 사용하면 사용자 정의보기 구현에 의존하는 것보다 더 많은 재사용 가능한 구성 요소를 만들 수 있습니다. 이유는 링크를 참조하십시오.
numan salati 2013

답변:


172

Fragments를 사용하는 주된 이유는 백 스택 및 수명주기 기능 때문입니다. 그렇지 않으면 사용자 정의보기가 더 가볍고 구현하기가 더 간단합니다.

처음에는 실제로 사용자 지정보기를 사용하여 휴대폰 / 태블릿 앱을 구축하려고했습니다. 단일 패널에서 분할 패널로 전환하는 것까지도 모든 것이 휴대폰과 태블릿에서 작동하는 것처럼 보였습니다 . 내가 문제를 겪은 곳은 뒤로 버튼과 라이프 사이클이었습니다. 단순히 수동으로 뷰를 업데이트했기 때문에 뷰의 기록과 상태를 추적하는 것이 없었습니다. 따라서 뒤로 버튼이 예상대로 작동하지 않았고 앱을 회전 할 때와 같은 라이프 사이클 이벤트 동안 최신 상태도 재현하기 어려웠습니다. 이 문제를 해결하기 위해 사용자 지정 뷰를 조각으로 래핑하고 FragmentManager를 사용하여 이전 상태를 저장하고 다시 만들어야했습니다.

1 년 전에 비슷한 질문에 게시했다는 답변을 듣고 깨달았습니다 : https://stackoverflow.com/a/11126397/618881


14
아주 좋은 대답입니다. 나는 단지 4.2 이후에 조각이 중첩 될 수 있거나 라이브러리 rev 11을 지원할 수 있다고 덧붙이고 싶었습니다.
kar

2
업데이트에 대해 @Karlo에게 감사드립니다. 나는 그것이 개념적으로 가능하다고 생각하지 않았지만 getChildFragmentManager ()를 통해 개인 FragmentManager를 사용하여 해결했습니다. 아, 11이 아닌 API 17이며 지원 라이브러리를 통해 사용할 수 있습니다.
Henry

2
이 질문을 다시보고 있었는데 내 경험도 바뀌 었습니다. 이것은 장점과 단점을 모두 잘 이해하고 매우 도움이되는 답변입니다. 감사!
Phil

2
이 답변을 +1하고 싶지만 그렇게하면 현재 점수가 손상됩니다. 게다가 70은 내가 가장 좋아하는 숫자가 아닙니다.
Behnam

1
작년에 저는 Fragments가 특별한 기능을 제공하지 않는다고 생각했지만 활동을 다시 클릭 한 후 다운로드 된 모든 이미지를 잃어 버려서 캐시 구현을 추가해야했습니다. 아주 쉽게 할 수있다 조각
Shirish Herwade

27

Fragments는 두 가지 시나리오에서 유용하다고 말하고 싶습니다. 일부 장치 / 방향에서보기를 분할하고 두 가지 활동으로 표시하고 다른 장치에서 모든 콘텐츠를 하나에 표시하는 경우입니다. 태블릿이나 휴대폰의 가로 모드에서 사용하는 경우가 있습니다. 예를 들어 항목 목록과 세부 정보를 한 화면에 표시합니다. 휴대폰이나 세로 모드에서는 한 부분 만 보여줍니다.

또 다른 사용 사례는 재사용 가능한 뷰입니다. 따라서 다른 활동에서 볼 수있는 일부 뷰가 있고 일부 작업을 수행하는 경우이 동작을 조각에 넣은 다음 다시 사용할 수 있습니다. 분명히 커스텀 위젯으로도 그렇게 할 수 있습니다.

나는 모든 뷰에 대해 Fragments를 사용하는 이유를 알지 못하며 오버 헤드 일 뿐이라고 생각합니다. 나는 첫 번째 사용 사례에서만 사용하고 있으며 여기서 단순화라고 말하고 싶습니다.


감사합니다. 이것은 확실히 도움이되었습니다. 나는 뷰를 고수하고 재사용 가능하게 만들기 위해 나만의 '백 스택'을 만들 것이라고 생각합니다.
Phil

3

Android는 주로 태블릿과 같은 대형 화면에서보다 동적이고 유연한 UI 디자인을 지원하기 위해 Android 3.0 (API 레벨 11)에 프래그먼트를 도입했습니다. 태블릿의 화면이 핸드셋의 화면보다 훨씬 크기 때문에 UI 구성 요소를 결합하고 교환 할 여지가 더 많습니다. 조각을 사용하면보기 계층 구조에 대한 복잡한 변경을 관리 할 필요없이 이러한 디자인을 사용할 수 있습니다. 활동의 레이아웃을 조각으로 나누면 런타임에 활동의 모양을 수정하고 활동에서 관리하는 백 스택에 이러한 변경 사항을 보존 할 수 있습니다.

여기에서 더 많은 것을 읽을 수 있습니다.


나는 모든 문서를 읽었지만 태블릿이나 백 스택과 같이 그들의 이점을 더 잘 설명하는 것을 찾고있었습니다
Phil

3
  1. 시나리오 활동 분할 화면-하나의 레이아웃과 왼쪽 오른쪽 화면 부분을 처리하는 하나의 활동이 있습니다.
  2. 시나리오 FragmentActivity 우리는 메인 화면에 하나의 레이아웃, 왼쪽에 하나, 오른쪽에 하나가 있습니다.

간단한 응용 프로그램이있는 경우 시나리오 1이 좋습니다.

시나리오 2는 여러 Fragment와 여러 FragmentActivities를 원하고 각각을 결합 할 수있는 경우에 적합합니다. 또한 조각 간의 상호 작용을 만들 수 있습니다.

분할 화면 Fragmentactivity가 있습니다 .'Intent Extras '로 호출하고 어떤 조각이로드 될 것인지 fragmentActivity에 알릴 수 있습니다. 조각은 매니페스트에 없으므로 재사용 가능한 조각과 FragmentActvity를 만들 수 있기 때문에 좋습니다.

그러나 그것은 당신의 프로젝트를 더 크게 만듭니다. 그러나 큰 프로젝트를 만들면 많은 것을 저장할 수 있습니다. 동일한 Fragment 또는 동일한 Fragment 활동을 사용할 수 있기 때문입니다.

그리고 저는이 조각들이 조금 늦게 나오기 때문에 새로운 방식으로 생각해야합니다. 활동을 FragmentActivity로 변환 해보세요. 나중에 재사용 가능한 코드를 찾아서 조각을 만드십시오.

유용하지만 지금은 어떻게되는지 모르겠습니다. 하지만 몇 가지 아이디어가 있습니다.

이것은 항상 문제입니다. Android 팀은 생각을했고 누구도 무엇이 좋은지 모릅니다. 우리는 예전처럼 배우는 것이 거의 없기 때문에 여기에 새로운 것이 있습니다.

제 생각에는 그것은 좋지만 Google이 우리에게 말하는 이유가 아닙니다.


0

CustomView를 통해 Fragment 또는 Activity를 사용할 때 하나의 케이스를 추가하십시오.

CursorLoader를 사용하여 특정 뷰, ListView 또는 TextView를 관찰하고 ContentProvider의 데이터가 백엔드에서 업데이트 될 때마다 해당 표시 값을 업데이트하려는 경우 (가장 일반적인 경우 원격 데이터베이스 / 클라우드의 데이터를 주기적으로 폴링하여 로컬 데이터베이스를 업데이트하는 서비스가 있습니다. )


-2

위의 모든 주석에서 언급하지 않은 한 가지 큰 점은 Android가 활동을 종료하고 장치 방향 변경과 같은 작업을 수행 할 때 다시 시작하더라도 조각이 메모리에 남아 있다는 것입니다. 이것은 성능상의 이유로 수행되지만 조각이 갑자기 다시 생성되는 것을 발견하기 위해 조각이 파괴 될 것으로 예상하는 경우 예기치 않은 결과가 발생할 수도 있습니다.

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