조각 안드로이드에서 재사용 보기
-
12-11-2019 - |
문제
내 조각에 내 보기 상태를 저장하려고 하는데 내 활동이 누출될까봐 걱정됩니다.내가하고있는 일은 다음과 같습니다.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state){
if(mView != null){
View oldParent = mView.getParent();
if(oldParent != container){
((ViewGroup)oldParent).removeView(mView);
}
return mView;
}
else{
mView = inflater.inflate(R.id.fragview, null)
return mView;
}
}
모든 뷰가 컨텍스트를 유지한다는 것을 알고 있고 인플레이터에서 팽창된 경우 이것이 활동 컨텍스트인지 애플리케이션 컨텍스트인지 알 수 없기 때문에 걱정됩니다.아마도 팽창기를 사용하는 것보다 getActivity().getApplication()을 사용하여 실용적으로 뷰를 생성하고 해당 속성을 설정하는 것이 더 나은 아이디어일 것입니다.이에 대한 피드백을 주시면 감사하겠습니다.
감사해요!
편집하다:활동 누출이 확인되었습니다. 이 코드는 훌륭하게 작동하지만 그렇게 하지 마세요. *(
해결책
나는 내 조각에 내 뷰 주를 저장하려고 노력하고 있지만, 나는 내 활동을 유출하는 것이 좋습니다.
구성 변경에서 "상태보기"를 유지하기 위해
onSaveInstanceState()
(Fragment) 및onRetainConfigurationInstance()
(Activity)를 사용하십시오.나는 당신이 언급 할 수있는 다른 "보기 상태"가 무엇을 확신하지 못합니다.모든 뷰가 컨텍스트를 붙잡는 것을 알고 있기 때문에 걱정하고 Inplater에서 팽창 된 경우 활동 상황이나 응용 프로그램 컨텍스트인지 알지 못합니다.
View Inflation을 위해
Application
를 사용하는 이래로 잘 작동하지 않는 것 같지 않으므로Activity
에서 팽창해야합니다.따라서 뷰는 이들을 팽창 한 활동에 대한 참조를 보유합니다.
다른 팁
@schwiz é도 비슷한 것을 구현했습니다.
나는 setRetainInstance
조각에서.조각 레이아웃에는 webView를 안에 넣을 FrameLayout 자리 표시자가 있습니다.
이 webView는 애플리케이션 컨텍스트를 사용하여 Fragment의 onCreate에서 프로그래밍 방식으로 생성됩니다. addView(webView)
부풀려진 레이아웃에 onCreateView()
.
webView = new WebView(getActivity().getApplicationContext());
그리고 onDestroyView에서는 프레임레이아웃 자리 표시자에서 webView를 제거하기만 하면 됩니다.
전체 화면으로 비디오를 재생하지 않는 한 정말 잘 작동합니다.활동 컨텍스트가 필요하기 때문에 작동하지 않습니다.
내 조각에 내 뷰 상태를 저장하려고합니다
View의 상태를 저장하고 유지하려면
View.onSaveInstanceState ()
및View.onRestoreInstanceState (Parcelable state)
를 사용할 수 있습니다.활동이나 조각과 독립적으로보기 상태를 절약하고 복원하는 데 도움이됩니다. 그것에 대한 자세한 내용은이 답변을 참조하십시오 ( 화면 방향 변경의 상태를 잃지 않는 사용자 정의보기를 방지하는 방법 )