其实我总是把我的观点重新用在我的片段中,如下所示:
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会关注缓存和适当地重用这些视图.这不是片段的情况.