gpt4 book ai didi

android - 使用抽屉导航管理 fragment 生命周期

转载 作者:太空狗 更新时间:2023-10-29 14:14:18 25 4
gpt4 key购买 nike

我的应用程序存在架构问题。我使用了一个带有抽屉导航和几个 fragment 的 Activity 。现在,

假设我有两个 fragment A 和 B 。导航结构有点:

一个

   A1
A2

B

   B1
B2

其中 A1、A2 属于 A 型 fragment ,B1、B2 属于 B 型 fragment 。相同类型 fragment 之间的唯一区别,例如。 A1,A2 是数据。

我的第一个方法:

每当用户点击 A1,A2,B1,B2 时。我只是创建该类型的新实例并替换该 fragment 。

  Fragment fragment =A.newInstance();

private void replaceFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment).commit();
mDrawerLayout.closeDrawer(rlDrawer);
}

注意:我不想将它们添加到返回堆栈。

后来我意识到这种方法效率低下,因为每次它都会在该 fragment 上创建一个新实例,即使它们属于同一类型。正如我之前所说,差异仅在于数据。因此,我转向下一种方法

第二种方法:

现在我的 Activity 有 fragment A 和 B 的数据成员(引用)。现在我将检查它是否为空,然后创建一个新实例,否则只需更改数据:

   if (A == null) {
a = A.newInstance();
} else {
((A) a).changeData();
}
replaceFragment(a);

这种方法的问题是,当我从 fragment A1 切换到 B1 时,A1 fragment 被销毁,但它的引用仍保留在 activity 中。现在,当我从 B1 切换回 A1 时,它不会像您在上面的代码中看到的那样创建一个新实例,但同时会在 fragment A 上调用 onCreate() 方法。

在 Fragment 上调用 onDestroy() 后,我是否应该从 Activity 中删除引用?

我的第二种方法是否正确?

有没有更好的方法?

提前致谢。

最佳答案

我会略微修改您的第一种方法。

为您的 fragment 使用字符串标签。当您替换 fragment 时,使用带有三个参数的 replace 方法,例如:

  fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment, TAG_A1).commit();

其中 TAG_A1 是唯一的字符串标记。

您可以使用方法findFragmentByTag来自 FragmentManager在执行替换之前检查 fragment 是否已创建。

FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragmentA1 = fragmentManager.findFragmentByTag(TAG_A1);
if(fragment == null) {
fragment = A.newInstance();
}
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment, TAG_A1).commit();

关于android - 使用抽屉导航管理 fragment 生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24122393/

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