【问题标题】:Understanding FragmentManager and FragmentTransaction lifecycle with regards to Activity了解关于 Activity 的 FragmentManager 和 FragmentTransaction 生命周期
【发布时间】:2014-02-20 20:27:50
【问题描述】:

我正在尝试更好地了解 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) 当我点击手机上的后退按钮退出 Activity 时,我重新启动了示例 使用应用程序菜单的活动。 CameraFragment 不再可见,
onCreate() 检查显示 fragMan 仍然不为空。我以为按下后退按钮 调用默认的完成()命令,从内存中清除活动并重新启动它 会产生与示例 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();

    }

【问题讨论】:

    标签: android android-layout android-fragments android-framework


    【解决方案1】:

    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 一起创建

    【讨论】:

    • 您好,谢谢您的回复。我知道静态变量与应用程序进程的存在相关,而不是 Activity(class) 实例本身。关于主屏幕,我知道如果用户点击主页按钮,活动不会被破坏,但是当我按下后退按钮时,我在日志中看到了“onStop()”命令。主要问题是关于静态 fragmentManager(不是 CameraFragment 实例)如何不为 null,但返回 true 到 isDestroyed() 并且无法找到之前的 CameraFragment 的困惑。
    • FragmentManager 是一个静态变量,正如您所指出的,它与应用程序进程相关联 - 这就是为什么当您返回 Activity 时它不为空。
    • 您编辑的答案以及详细的流程对您有很大帮助!我正在尝试将 Fragment 动态附加到 Activity,现在知道如何最好地做到这一点。静态 fragmentManager 显然只会浪费内存。谢谢唐
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 2012-09-21
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    相关资源
    最近更新 更多