android片段中的视图重用

Posted

技术标签:

【中文标题】android片段中的视图重用【英文标题】:View reuse in fragments android 【发布时间】:2011-07-24 00:34:30 【问题描述】:

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

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

谢谢!

编辑:确认 Activity 泄漏,尽管此代码效果很好,但不要这样做:*(

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

@commonsware 我应该提到我正在使用兼容性包并且不能覆盖onRetainConfigurationInstance(),因为它在FragmentActivity 中是最后的。在这种情况下,我试图保留我的整个 WebView 并且不要想要在设备旋转时重新加载页面。尽管如果这是一个可行的解决方案,我想重用这种技术来保留 EditText 中的文本等内容。您在使用应用程序进行膨胀时遇到了哪些问题,以及由于膨胀方法不采用上下文参数,您是如何做到的?感谢您的快速回复! @schwiz:Gadzooks!让onRetainNonConfigurationInstance() 成为final 是一个大问题。还没有遇到过。 “在这种情况下,我试图保留我的整个 WebView,并且不想在设备旋转时重新加载页面”——WebView 是使用android:configChanges 并避免销毁/重新创建周期的一个好地方,恕我直言。 @schwiz:“您在使用应用程序膨胀时遇到了哪些问题,以及由于膨胀方法不接受上下文参数,您是如何做到的?” -- LayoutInflater.from() 接受Context,但您通常从getLayoutInflater() 中的Activity 获取它,它使用自己作为Context。有人重用我的一个组件时遇到了问题,真正的问题是使用Application 膨胀布局。对于某些小部件来说,这可能是可以的,但我怀疑有些人会认为ContextActivity @commonsware 通过 FragmentManager 代码设置我看到它通过调用包含活动的 getLayoutInflater() 来获取充气机。这是一个无赖,因为我不认为使用 android:configChanges 是一个好的解决方案。也许不包含在兼容性包中的 3.0 中的 WebFragment 解决了这个问题。我不明白您无法设置上下文以查看可能造成的危害!这非常令人沮丧! 我最终在这种情况下,而不是使用充气机只是自己创建一个 WebView 的新实例并将其传递给应用程序。幸运的是,我还没有遇到任何问题,尽管我仍然认为 View 应该有一个 setContext 方法!感谢您输入马克!【参考方案2】:

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

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

这个 webView 是使用应用程序上下文在 Fragment 的 onCreate 上以编程方式创建的,我在 onCreateView() 中的膨胀布局上执行 addView(webView)

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

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

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

【讨论】:

【参考方案3】:

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

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

它将帮助您独立于活动或片段处理保存和恢复视图状态。 有关更多信息,请参阅此答案 (how to prevent custom views from losing state across screen orientation changes)

【讨论】:

以上是关于android片段中的视图重用的主要内容,如果未能解决你的问题,请参考以下文章

带有导航抽屉的 Android 应用程序的正确结构

何时从android中的布局加载片段中的视图

android片段-当另一个片段被推到它上面时如何保存片段中的视图状态

可重用的视图?

标签视图中的 Android 操作栏搜索

如何在android中使用底部导航视图时恢复片段状态?