문제

내 조각에 내 보기 상태를 저장하려고 하는데 내 활동이 누출될까봐 걱정됩니다.내가하고있는 일은 다음과 같습니다.

@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) 를 사용할 수 있습니다.

활동이나 조각과 독립적으로보기 상태를 절약하고 복원하는 데 도움이됩니다. 그것에 대한 자세한 내용은이 답변을 참조하십시오 ( 화면 방향 변경의 상태를 잃지 않는 사용자 정의보기를 방지하는 방법 )

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top