首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >片段-我应该在onCreateView中重用视图吗?我应该如何做到这一点?

片段-我应该在onCreateView中重用视图吗?我应该如何做到这一点?
EN

Stack Overflow用户
提问于 2013-09-05 13:03:15
回答 3查看 6.5K关注 0票数 14

实际上,我总是在我的片段中重用我的视图,如下所示:

代码语言:javascript
复制
private View mView = null;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    if (mView == null)
        mView = inflater.inflate(R.layout.view);
    return mView;
}

它起作用了,有了查看器等等。现在,我也开始在简单的活动中使用我的片段,如果并且只有当我将片段添加到后台时,这将因为java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.而失败。

所以我的问题是:

  • 是否可以,如果我检查视图父级,删除它并将其添加到新父级中吗?
  • 还是我应该总是重新创建视图,永远不要重用它?如果是,为什么?
  • 还有其他点,重用视图会失败吗?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-05 14:36:32

也许这能帮助你理解这种行为。如果您签出FragmentManagerImpl.java,您将发现以下内容:

首先通过调用onCreateView() (第845行)创建视图,然后用另一个视图包装已创建的视图,该视图将成为视图的父视图(第848-849行)。这意味着我们的视图不是真正容器的子视图,而是包装器视图的子视图。当视图从容器中移除时,重用问题就会发生(第998行)。FragmentManager从容器中移除包装器视图,但是我们的实际视图仍然被添加到父包装视图中。这就是你所经历的问题的原因。

因此,如果从其父视图中删除视图,则它可以工作。即使知道了这一点,我也不会建议重用片段中的视图,因为视图比片段活得更长,因为它们可以用于“消失”的动画,即使片段被销毁了。如果您当时试图从其父视图中删除这样的视图,那么动画可能会中断。

另一个不缓存视图的理由是,Android不支持按设计在片段中回收视图。还记得ListAdapter允许重用视图吗?Android负责缓存和正确重用这些视图。然而,碎片的情况并非如此。

票数 14
EN

Stack Overflow用户

发布于 2014-05-07 13:31:36

我目前正在重用视图,如下所示:

代码语言:javascript
复制
if(view == null){
    view = (ViewGroup) inflater.inflate(R.layout.news_list, container, false);
} else {
    ((ViewGroup) view.getParent()).removeView(view);
}
return view;

我不知道这种方法是否正确,但它似乎对我有用。

注意:我使用这个aproach是因为我在片段中有一个listview,当用户点击一个项目时,它会加载一个新的片段(片段管理器替换当前的列表片段)。然后,当用户单击same按钮时,由于我正在重用片段的相同旧视图(在使用FM删除时未被销毁),则用户将继续在打开详细片段视图之前的位置查看列表。

票数 8
EN

Stack Overflow用户

发布于 2018-05-10 03:46:53

我知道这是个老问题。但是在使用了几个月的片段之后,我发现在以这种方式使用缓存时需要提到的一件事是:如果您当前的缓存布局还有另一个片段标记,这种缓存策略将导致嵌入片段丢失一些生命周期回调。我会详细讲一下:

  1. 第一次调用当前片段onCreateView。通过像上面这样的缓存,我们将膨胀目标布局(这个布局包括一个片段标记)。
  2. 通过inflater.inflate,这将使嵌入片段正确地添加到布局中,onCreateView将被调用。
  3. 当需要销毁当前片段时,将正确调用嵌入片段onDestroyView
  4. 当当前片段onCreateView再次调用时,我们返回缓存的视图,而不调用inflater.inflate。您将发现嵌入片段onCreateViewonDestroyView或其他生命周期方法不会被调用。

我只想提这些。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18637134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档