pro*_*m85 13 android view reusability android-fragments
实际上,我总是在我的片段中重用我的视图,如下所示:
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;
}
Run Code Online (Sandbox Code Playgroud)
这有效,有viewpager等.现在我开始在简单的活动中使用我的片段,如果,并且只有当我将片段添加到backstack时,这将因为java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
所以我的问题是:
ser*_*nka 13
也许这有助于理解这种行为.如果您查看FragmentManagerImpl.java,您将找到以下内容:
首先,我们通过调用onCreateView()(第845行)创建一个视图,然后我们用另一个视图包装创建的视图,该视图成为我们视图的父视图(第848-849行).这意味着我们的视图不会成为真正容器的子项,但它现在是包装器视图的子项.当从容器中删除视图时,会发生重用问题(第998行).FragmentManager从容器中删除包装器视图,但我们的实际视图仍然添加到父包装器视图中.这就是导致您遇到问题的原因.
因此,如果从父项中删除视图,它可以工作.即使知道这一点,我也不建议在片段中重复使用视图,因为视图可以比片段长一些,因为它们甚至可以在片段被破坏后用于"消失"动画.如果您当时尝试从其父级删除此类视图,则动画可能会被破坏.
另一个不缓存视图的论点是,Android不支持按片段进行视图回收.还记得ListAdapter允许重用视图吗?Android负责缓存并正确地重用这些视图.但是碎片不是这种情况.
我正在重复使用这样的视图:
if(view == null){
view = (ViewGroup) inflater.inflate(R.layout.news_list, container, false);
} else {
((ViewGroup) view.getParent()).removeView(view);
}
return view;
Run Code Online (Sandbox Code Playgroud)
我不知道这种方式是否正确,但似乎对我有用..
注意:我正在使用这个方法,因为我在一个片段中有一个listview,当用户点击一个项目时,它会加载一个新片段(片段管理器替换当前列表片段使用).然后,当用户点击后退按钮时,因为我正在重复使用片段的相同旧视图(当使用FM移除时不会被破坏),然后用户继续在打开详细信息片段视图之前查看列表.
| 归档时间: |
|
| 查看次数: |
5580 次 |
| 最近记录: |