android – 片段 – 应该在onCreateView中重用视图,我该怎么做?

其实我总是把我的观点重新用在我的片段中,如下所示:
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而失败:指定的子节点已经有一个父节点.您必须首先调用子对象的removeView().

所以我的问题是:

>是的,如果我查看父母的意见,删除它并将其添加到新的父母?
>或者我应该总是重新创建视图,不要重复使用它?如果是,为什么?
>还有其他点,重用视图会失败吗?

解决方法

也许这可以帮助了解行为.如果您查看 FragmentManagerImpl.java,您会发现以下内容

首先,我们通过调用onCreateView()(第845行)创建一个视图,然后我们用另一个视图来包装创建的视图,这个视图成为我们视图的父级(行848-849).这意味着我们的观点不会成为真正的容器的孩子,但它现在是包装器的一个孩子.当视图从容器中删除时(第998行),重复使用的问题就出现了. FragmentManager从容器中删除包装器视图,但是我们的真实视图保持添加到父包装器视图中.这是导致您遇到的问题.

因此,如果从其父项中删除视图,则可以正常工作.即使知道这一点,我不建议在片段中再次使用观点,因为视图可以比片段长一点,因为即使片段被破坏,它们也可以用于“消失”动画.如果您尝试从当时的父母中删除这样的视图,那么动画可能会被破坏.

不缓存视图的另一个观点是Android不支持按设计在片段中进行视图回收.记住listadapter允许重用视图? Android会关注缓存和适当地重用这些视图.这不是片段的情况.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...