3

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

我特意创建了一个名为 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)当我点击手机上的后退按钮退出活动时,然后我使用应用程序菜单重新启动了示例活动。CameraFragment 不再可见,并且
onCreate() 检查显示 fragMan 仍然不为空。我认为点击后退按钮称为默认完成()命令,从内存中清除 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();

    }
4

1 回答 1

2

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 丢失了它包含的所有片段,isDestroyed() 将返回 true。
  6. 再次启动应用程序
  7. 新的 Activity 实例 A2 与其新的 FragmentManager 实例 FM2 一起创建
于 2014-03-10T15:32:46.613 回答