8

我正在尝试将我的视图状态保存在我的片段中,但我担心我会泄露我的活动。这是我正在做的事情:

@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() 务实地创建视图并设置其属性而不是使用充气器会是一个更好的主意。我将不胜感激对此的任何反馈。

谢谢!

编辑:确认活动泄漏,虽然这段代码很好,但不要这样做:*(

4

3 回答 3

2

我正在尝试将我的视图状态保存在我的片段中,但我担心我会泄露我的活动。

使用onSaveInstanceState()(在片段中)和onRetainConfigurationInstance()(在活动中)跨配置更改维护“视图状态”。我不太确定您可能指的是什么其他“视图状态”。

我很担心,因为我知道所有视图都保留一个上下文,如果从充气器充气,我不知道它是活动上下文还是应用程序上下文。

由于使用Applicationfor view 膨胀似乎效果不佳,因此您应该从Activity. 因此,视图将包含对膨胀它们的 Activity 的引用。

于 2011-03-27T19:21:36.040 回答
1

@schwiz é 已经实现了类似的东西。

setRetainInstance在片段中使用。在片段布局上,我有一个 FrameLayout 占位符,我将 webView 放在里面。

这个 webView 是使用应用程序上下文在 Fragment 的 onCreate 上以编程方式创建的,我addView(webView)onCreateView().

webView = new WebView(getActivity().getApplicationContext());

在 onDestroyView 上,我只需从框架布局占位符中删除 webView。

它工作得非常好,除非您尝试全屏播放视频。这不起作用,因为它需要一个活动上下文

于 2011-11-09T18:16:24.610 回答
0

我正在尝试将我的视图状态保存在我的片段中

为了保存和保留视图的状态,您可以使用View.onSaveInstanceState ()View.onRestoreInstanceState (Parcelable state)

它将帮助您独立于活动或片段处理保存和恢复视图状态。有关它的更多信息,请参阅此答案(如何防止自定义视图在屏幕方向更改时丢失状态

于 2012-08-15T06:55:51.783 回答