我正在尝试更好地理解FragmentManager和FragmentTransactions以正确开发我的应用程序。具体是关于它们的生命周期,以及提交FragmentTransaction(add)的长期效果。我对此感到困惑的原因是我在帖子末尾列出了一个示例活动。
我故意创建一个名为fragMan的静态FragmentManager变量,并最初将其设置为null。然后在onCreate()中检查它是否为null,并且当看到null值时,fragMan变量被设置为getFragmentManager()返回值。在配置更改期间,Log.d显示fragma不为null,但在fragman中找不到先前添加的Fragment“CameraFragment”,并且fragman.isDestroyed()返回true。这对我来说意味着Activity.getFragmentManager()返回一个FragmentManager的新实例,并且fragMan中的旧FragmentManager实例已擦除其数据(?)
这就是混乱的来源。
1)如果在配置更改的活动中“CameraFragment”仍然关联,并且在中找到 FragmentManager的新实例?
2)当我按下手机上的后退按钮退出活动时,我重新启动了样本 使用“应用”菜单的活动。 CameraFragment不再可见了,而且 onCreate()检查发现fragMan仍然不是null。我以为按了后退按钮 调用默认的finish()命令,从内存中清除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();
}
答案 0 :(得分:3)
Java中的静态变量保留在Activity创建/销毁中 - 它们与类本身相关联,但不与类的特定实例相关联。
请参阅此处的官方文档: http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
当用户返回主屏幕时,您的应用程序不会结束,它只会处于后台状态。如果您强制停止应用程序并重新启动它,那么静态FragmentManager将为null。
关于CameraFragment,除非你设置了setRetainInstance(true),否则它会在方向更改时被破坏。
====编辑
以下是有关正在发生的事情的详细信息......