이 두 가지 방법의 근본적인 차이점은 무엇입니까? 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);
}
답변
에서 뷰를 초기화하는 동안 충돌이 발생 onCreateView
합니다.
에서 레이아웃을 확장
onCreateView
해야하지만findViewById
in을 사용하여 다른 뷰를 초기화해서는 안됩니다onCreateView
.
때때로 뷰가 제대로 초기화되지 않기 때문입니다. 따라서 항상 findViewById
in onViewCreated
(뷰가 완전히 생성 된 경우)을 사용하고 뷰를 매개 변수로 전달합니다.
onViewCreated
뷰가 완전히 생성되었는지 확인하는 것입니다.
onViewCreated 안드로이드 문서
onCreateView
( android.view.LayoutInflater, android.view.ViewGroup
, android.os.Bundle
)가 반환 된 직후 , 저장된 상태가 뷰로 복원되기 전에 호출 됩니다. 이렇게하면 뷰 계층 구조가 완전히 생성되었음을 알게되면 하위 클래스가 스스로 초기화 할 수 있습니다. 그러나 조각의 뷰 계층은이 시점에서 부모에 연결되지 않습니다.
답변
onViewCreated
onCreateView
(초기화하고을 포함하여 모든 객체를 만드는 메서드) 직후에 호출 TextView
되므로 성능 문제가 아닙니다.
개발자 사이트에서 :
onViewCreated (보기보기, savedInstanceState 번들)
onCreateView (LayoutInflater, ViewGroup, Bundle)가 반환 된 직후, 저장된 상태가 뷰에 복원되기 전에 호출됩니다. 이렇게하면 뷰 계층 구조가 완전히 생성되었음을 알게되면 하위 클래스가 스스로 초기화 할 수 있습니다. 그러나 조각의 뷰 계층은이 시점에서 부모에 연결되지 않습니다.
답변
의 필드에 하위 뷰를 할당하는 것이 좋습니다 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);
}
답변
onCreateView
팽창 된 뷰를 반환합니다. OnViewCreated
바로 후에 호출 onCreateView
되고 get은 부풀린 뷰에 매개 변수를 갖습니다. 반환 유형은 다음과 같습니다.void
답변
onCreateView()
onCreate()
활동에 해당하는 조각이며 보기를 만드는 동안 실행됩니다 . 보기가 생성 된 후
onViewCreated()
실행됩니다 .
should I use one over the other for performance?
아니 . 성능 향상의 증거가 없습니다.
실제로 onCreate()
Fragments에도 메서드가 있지만 거의 사용 되지 않습니다 ( 사용하지도 않고 좋은 사용 사례도 찾지 못함).
나는 항상 onCreateView()
Fragments에서 onCreate()
.
그리고 나는 그것에 만족합니다.
답변
현재 문서Fragment.onCreateView()
는 다음과 같습니다.
이 메서드에서 레이아웃 만 확장하고 반환 된 View에서 작동하는 로직을 onViewCreated (View, Bundle)로 이동하는 것이 좋습니다.
이유를 이해할 필요가 없습니다. 문서가 말한대로해야하지만이 추천이 존재하는 이유를 아는 것은 흥미로울 것입니다. 내 최선의 추측은 관심사 분리 이지만 IMHO 이것은 필요 이상으로 조금 더 복잡하게 만듭니다.
답변
내가 사용하는 주된 이유 onViewCreated
는 .NET Framework에 있어야하는 뷰 계층 구조 인플레이션 / 생성 논리에서 초기화 논리를 분리하기 때문 onViewCreate
입니다. 다른 모든 성능 특성은 동일하게 보입니다.