gpt4 book ai didi

android - fragment - 我应该在 onCreateView 中重用 View 吗?我应该怎么做?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:22:05 24 4
gpt4 key购买 nike

实际上,我总是在我的 fragment 中重复使用我的 View ,如下所示:

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;
}

这对 viewpager 等有效。现在我也开始在简单的 Activity 中使用我的 fragment ,如果且仅当我将 fragment 添加到后台堆栈时,这将失败,因为 java.lang.IllegalStateException: 指定的 child 已经有一个 parent 。您必须先对 child 的 parent 调用 removeView()。

所以我的问题是:

  • 是否可以,如果我检查 View 父级,将其删除并将其添加到新父级?
  • 或者我是否应该始终重新创建 View 而不重复使用它?如果是,为什么?
  • 是否还有其他点,重用 View 会失败?

最佳答案

也许这有助于理解行为。如果你 checkout FragmentManagerImpl.java您会发现以下内容:

首先,我们通过调用 onCreateView()(第 845 行)创建一个 View ,然后我们用另一个 View 包装创建的 View ,该 View 成为我们 View 的父 View (< em>第 848-849 行)。这意味着我们的 View 不会成为真实容器的 subview ,但它现在是包装器 View 的 subview 。当 View 从容器中移除时(第 998 行),就会出现重用问题。 FragmentManager 从容器中移除包装器 View ,但我们的真实 View 仍然添加到父包装器 View 中。这就是导致您遇到问题的原因。

因此,如果您从其父 View 中删除 View ,它就可以工作。即使知道这一点,我也不建议在 fragment 中重用 View ,因为 View 可以比 fragment 长一点,因为即使在 fragment 被销毁后,它们也可以用于“消失”的动画。如果您当时尝试从其父 View 中删除这样的 View ,则动画可能会中断。

不缓存 View 的另一个论据是 Android 不支持 View 在 fragment 中的设计回收。还记得允许重用 View 的 ListAdapter 吗? Android 负责缓存和正确重用这些 View 。但是 fragment 不是这种情况。

关于android - fragment - 我应该在 onCreateView 中重用 View 吗?我应该怎么做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18637134/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com