Fragment에서 onCreateView와 onViewCreated의 차이점


118

이 두 가지 방법의 근본적인 차이점은 무엇입니까? TextView를 만들 때 성능을 위해 다른 하나를 사용해야합니까?

편집 : 차이점은 무엇입니까

onCreateView() {
  root = some view
  View v = new View(some context);
  root.add(v);
  return root;
}


onViewCreated() {
  View v = new View(some context);
  getView().add(v);
}

내 혼란을 설명하기 위해 편집을 추가했습니다. 한 가지 방법이 바로 뒤 따르면 왜 두 가지가 있습니까? 위와 같은 단일 방법으로 모든 뷰 생성을 수행 할 수 없습니까?
스미스

7
구글에서 추측해야한다면 이름이 잘못된 메서드가있을 것입니다.
Balázs Németh 2014

답변:


85

에서 뷰를 초기화하는 동안 충돌이 발생 onCreateView합니다.

에서 레이아웃을 확장 onCreateView해야하지만 findViewByIdin을 사용하여 다른 뷰를 초기화해서는 안됩니다 onCreateView.

때때로 뷰가 제대로 초기화되지 않기 때문입니다. 따라서 항상 findViewByIdin onViewCreated(뷰가 완전히 생성 된 경우)을 사용하고 뷰를 매개 변수로 전달합니다.

onViewCreated 뷰가 완전히 생성되었는지 확인하는 것입니다.

onViewCreated 안드로이드 문서

onCreateView( android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle)가 반환 된 직후 , 저장된 상태가 뷰로 복원되기 전에 호출 됩니다. 이렇게하면 뷰 계층 구조가 완전히 생성되었음을 알게되면 하위 클래스가 스스로 초기화 할 수 있습니다. 그러나 조각의 뷰 계층은이 시점에서 부모에 연결되지 않습니다.


4
감사. 나는 또한이 문제에 직면하고 구성 요소를 사용했습니다. post(...) 메소드가 표시 될 때까지 기다립니다. 아마도 findViewById 및 기타 초기화를 onViewCreated.
CoolMind

22
그 텍스트는 어디에서 인용 되었습니까? 공식 문서에서 찾을 수 없습니다.
Daniel

여기에 인용 된 진술의 개발자 사이트에서 참조를 게시 할 수 있습니까?
Namrata Bagerwal

4
이것은 실제로 정확하지 않습니다. onCreateView에서 뷰를 찾을 수 있지만 부풀린 후에 만 ​​이미 부풀린 뷰에서만 볼 수 있습니다. Fragment.findViewById ()는 안전하지 않지만, 이미 조각보기를 확장 한 경우 View.findViewById ()는 안전합니다.
colintheshots 19

46

onViewCreatedonCreateView(초기화하고을 포함하여 모든 객체를 만드는 메서드) 직후에 호출 TextView되므로 성능 문제가 아닙니다.

개발자 사이트에서 :

onViewCreated (보기보기, savedInstanceState 번들)

onCreateView (LayoutInflater, ViewGroup, Bundle)가 반환 된 직후, 저장된 상태가 뷰에 복원되기 전에 호출됩니다. 이렇게하면 뷰 계층 구조가 완전히 생성되었음을 알게되면 하위 클래스가 스스로 초기화 할 수 있습니다. 그러나 조각의 뷰 계층은이 시점에서 부모에 연결되지 않습니다.

출처 : Fragment # onViewCreated


28

의 필드에 하위 뷰를 할당하는 것이 좋습니다 onViewCreated. 이는 프레임 워크가 자동 null 검사를 수행하여 Fragment의 뷰 계층이 제대로 생성되고 확장되었는지 (XML 레이아웃 파일을 사용하는 경우) 확인하기 때문입니다.

코드 조각 출처 : FragmentManger.java

// This calls onCreateView()
f.mView = f.performCreateView(f.getLayoutInflater(f.mSavedFragmentState), null, f.mSavedFragmentState);

// Null check avoids possible NPEs in onViewCreated
// It's also safe to call getView() during or after onViewCreated()
if (f.mView != null) {
    f.mView.setSaveFromParentEnabled(false);
    if (f.mHidden) f.mView.setVisibility(View.GONE);
    f.onViewCreated(f.mView, f.mSavedFragmentState);
}

6
또한 뷰 계층 인플레이션 / 생성 로직에서 초기화 로직을 분리
orangemako

1
흥미 롭습니다.이 접근 방식이 더 나은 이유에 대한 추가 리소스가 있습니까? 이는 모든 onCreateView 메소드가 "return inflater.inflate (R.layout.layout_file, container, false);"로만 구성되어야 함을 의미합니까? onviewcreated에는 모든 "findViewById"메소드가 있어야합니까? 이로 인해 어떤 성능 향상이 발생합니까? 전환이 더 빨라질까요?
android_student

첫 번째 질문에 답하기 onCreateView위해는 조각의 뷰 계층을 만드는 데 사용됩니다. 이는 XML 인플레이션 또는 동적 생성 (예 : 프로그래밍 방식으로 Java 뷰 생성)을 통해 이루어질 수 있습니다. 그래서 당신은 전혀 전화하지 않을 수 있습니다 inflate. 그러나 프래그먼트에 UI 요소가 필요한 경우 일부 상위 뷰를 반환해야합니다. 그렇지 않으면 반환 null합니다.
orangemako 2015 년

성능 향상은 전혀 없습니다. github.com/android/platform_frameworks_base/blob/… 을 호출하는 의 FragmentManager및 조각 코드를 살펴보면 수명주기 콜백에 대한 몇 가지 사항이 보장됩니다 .performCreateViewonCreateView onViewCreated
orangemako 2015-09-20

1. 조각이 부모 활동에 동적으로 추가 된 경우 뷰 계층 구조가 컨테이너에 연결됩니다. 2. NPE에 대한 걱정없이 안전하게 뷰 조회를 수행 할 수 있습니다. 3. 애니메이션에 익숙하지 않지만 조각 전환이 이미 시작되었을 것입니다 (즉, UI 스레드 메시지 대기열로 전송 됨).
orangemako 2015 년

13

onCreateView팽창 된 뷰를 반환합니다. OnViewCreated바로 후에 호출 onCreateView되고 get은 부풀린 뷰에 매개 변수를 갖습니다. 반환 유형은 다음과 같습니다.void


1
내 혼란을 설명하기 위해 편집을 추가했습니다. 한 가지 방법이 바로 뒤 따르면 왜 두 가지가 있습니까? 위와 같은 단일 방법으로 모든 뷰 생성을 수행 할 수 없습니까?
스미스

3
onCreateView가 빠르게 반환되어야합니다. 예를 들어 OnViewCreate를 사용하여 초기화 작업을 수행 할 수 있습니다. 내가 말했듯이 onViewCreated는 onCreateView 내부에서 부풀린 View를 매개 변수로 가지고 있습니다. 따라서 getView전화 를 피할 수 있습니다
Blackbelt 2014-08-04

8

onCreateView()onCreate()활동에 해당하는 조각이며 보기를 만드는 동안 실행됩니다 . 보기가 생성 된
onViewCreated() 실행됩니다 .

should I use one over the other for performance? 아니 . 성능 향상의 증거가 없습니다.

실제로 onCreate()Fragments에도 메서드가 있지만 거의 사용 되지 않습니다 ( 사용하지도 않고 좋은 사용 사례도 찾지 못함).

나는 항상 onCreateView()Fragments에서 onCreate().
그리고 나는 그것에 만족합니다.


2
@npace, 왜? 나는 또한 onCreateViewActivity의 onCreate.
CoolMind

2
@CoolMind 음, nPace는 Framents에도 메서드가 있기 때문에 완전히 잘못된 것은 아닙니다 onCreate(). 그러나 그것은 결코 사용 되지 않습니다 (또는 적어도 나는 그것을 사용 하지 않습니다 ). 나는 항상 onCreateView()Fragments에서 대체물로 사용합니다.
Phantômaxx

1
@Rotwang, 동의합니다! 일부 자습서에서는 onCreate를 사용하여 setHasOptionsMenu (true)를 넣지 만 onCreateView 또는 onViewCreated에서 더 잘 수행 할 것이라고 생각합니다.
CoolMind

1
@CoolMind 나는 완전히 동의합니다. 내 대답에 잘못된 단어를 사용했을 수도 있습니다.
Phantômaxx

1
@Rotwang, 맞아요. 조각을 처음 사용했을 때 왜 onCreate가 사용되지 않는지도 몰랐습니다.
CoolMind

4

현재 문서Fragment.onCreateView() 는 다음과 같습니다.

이 메서드에서 레이아웃 만 확장하고 반환 된 View에서 작동하는 로직을 onViewCreated (View, Bundle)로 이동하는 것이 좋습니다.

이유를 이해할 필요가 없습니다. 문서가 말한대로해야하지만이 추천이 존재하는 이유를 아는 것은 흥미로울 것입니다. 내 최선의 추측은 관심사 분리 이지만 IMHO 이것은 필요 이상으로 조금 더 복잡하게 만듭니다.


이유는 관심의 분리 인 경우, 왜 활동에 레이아웃을 부풀려 않습니다 setContentView()onCreate()?
Minh Nghĩa

@ MinhNghĩa 좋은 지적입니다. 그 질문에 대한 답은 단순히 다른 프로그래머가 다르게 생각하고 (조각은 우리가 처음 Android를 얻은 후 몇 년 후에 소개됨) 설계했지만 누가 알 수 있다는 것입니다.
Peppe LG

2

내가 사용하는 주된 이유 onViewCreated는 .NET Framework에 있어야하는 뷰 계층 구조 인플레이션 / 생성 논리에서 초기화 논리를 분리하기 때문 onViewCreate입니다. 다른 모든 성능 특성은 동일하게 보입니다.


2

나는 이것들 사이의 주요 차이점은 kotlin.in onCreateView () 를 사용할 때 마다 xml 파일에서보기 위해 액세스 할 때 findViewById 를 사용해야 하지만 onViewCreated 에서는 단순히 ID를 호출하여보기에 액세스 할 수 있다는 것입니다. .


정말 사실인가요? 어느 쪽이든 코드에서 ID를 사용하면 뷰에 대해 null이 발생합니다. 항상 findViewById를 사용해야합니다.
Jim Leask

1
아니요 .. oncreate 뷰는 뷰를 인스턴스화하고 onviewcreated는 oncreateview 이후에 저장된 상태가 복원되기 전에 호출됩니다. 조각의 수명주기에서 타이밍 문제가 더
많습니다

1

onCreateView는 조각에서 레이아웃을 만들고 뷰를 확장하는 데 사용됩니다. onViewCreated는 위의 메소드로 생성 된 뷰를 참조하는 데 사용됩니다. 마지막으로 onActivityCreated에서 액션 리스너를 정의하는 것이 좋습니다.

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