gpt4 book ai didi

android - 了解与 Activity 有关的 FragmentManager 和 FragmentTransaction 生命周期

转载 作者:太空狗 更新时间:2023-10-29 12:43:22 26 4
gpt4 key购买 nike

我正在尝试更好地了解 FragmentManager 和 FragmentTransactions 以正确开发我的应用程序。特别是关于它们的生命周期,以及提交 FragmentTransaction(add) 的长期影响。我对此感到困惑的原因是当我运行示例 Activity 时,该 Activity 列在帖子末尾。

我特意创建了一个名为 fragMan 的静态 FragmentManager 变量,并最初将其设置为 null。然后在 onCreate() 中检查它是否为 null,当看到 null 值时,fragMan 变量将设置为 getFragmentManager() 返回值。在配置更改期间,Log.d 显示 fragma 不为空,但在 fragman 中找不到之前添加的 fragment “CameraFragment”,并且 fragman.isDestroyed() 返回 true。这对我来说意味着 Activity.getFragmentManager() 返回一个新的 FragmentManager 实例,而 fragMan 中的旧 FragmentManager 实例的数据已被删除(?)

这就是困惑的来源。

1) “CameraFragment”如何在配置更改时仍然与 Activity 关联并在 FragmentManager 的新实例?

2) 当我点击手机上的后退按钮退出 Activity 时,我重新启动了示例 使用应用程序菜单的 Activity 。 CameraFragment 不再可见,
onCreate() 检查显示 fragMan 仍然不为空。我以为点击后退按钮 调用默认的 finish() 命令,从内存中清除 Activity 并重新启动它 会产生与示例 Activity 的初始启动相同的结果吗?

感谢您提供的所有帮助!

public class MainActivity extends Activity 
{

static FragmentManager fragMan = null;
FragmentTransaction fragTransaction;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (fragMan != null)
{

Log.d("log", Boolean.toString(fragMan.isDestroyed()));
if(fragMan.findFragmentByTag("Camera Preview") == null)
{
Log.d("log", "Camera Preview not found.");
}
}
else
{
fragMan = getFragmentManager();
fragTransaction = fragMan.beginTransaction();
Fragment cameraFragment = new CameraFragment();
ViewGroup root_view = (ViewGroup) findViewById(android.R.id.content);
fragTransaction.add(root_view.getId(), cameraFragment, "Camera Preview");
fragTransaction.commit();

}

最佳答案

Java 中的静态变量在 Activity 创建/销毁过程中保持不变 - 它们与类本身相关联,但与类的特定实例无关。

请在此处查看官方文档: http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

当用户返回主屏幕时,您的应用程序并没有结束,它只是进入后台状态。如果您强制停止应用程序并重新启动它,则静态 FragmentManager 将为空。

关于 CameraFragment,除非您设置了 setRetainInstance(true),否则它将在方向更改时被销毁。

==== 编辑

这是正在发生的事情的更详细流程...

  1. 您第一次打开应用程序
  2. Activity,比如实例 A1,被创建,它对应的 FragmentManager 实例 FM1,也被创建
  3. 将 FM1 存储为静态变量
  4. 你回家
  5. Activity A1 和 FM1 由于正常的 Activity 生命周期而被销毁,尽管 FM1 的引用仍由静态变量保留。此时,FM1 丢失了它包含的所有 fragment ,isDestroyed() 将返回 true。
  6. 再次启动应用
  7. 新的 Activity 实例 A2 与其新的 FragmentManager 实例 FM2 一起创建

关于android - 了解与 Activity 有关的 FragmentManager 和 FragmentTransaction 生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21918811/

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