我有一个保留的片段在旋转屏幕时工作正常(在调用父应用程序' onCreate()之后)。
然而,只要我离开应用程序并返回它(例如,通过转到主屏幕然后返回到我的应用程序),片段似乎表现不正确。
基本上发生的事情是,每次我回归'在我的活动中,片段似乎是“重置”#39;某种程度上来说。这可能与碎片事务有关吗?
在最后一次调用Log.d()时,gameFragment.testValue返回null - 这是怎么回事?我设置值的唯一地方是通过早期的条件块。如果没有设置该值,将如何创建片段?
gameFragment = (GameFragment)fragmentManager.findFragmentByTag("gameFragment");
if (gameFragment == null)
{
gameFragment = new GameFragment();
gameFragment.setRetainInstance(true);
gameFragment.testValue = new Random().nextInt(1000);
Log.d("hmm", " after set test value:" +gameFragment.testValue);
fragmentManager.beginTransaction().add(gameFragment, "gameFragment").commit();
fragmentManager.executePendingTransactions();
gameFragment.testValue = new Random().nextInt(1000);
Log.d("hmm", " after commit, after set test value:" +gameFragment.testValue);
}
else
{
Log.d("hmm", "test value:" +gameFragment.testValue);
}
答案 0 :(得分:2)
检查documentation您会找到
Fragment的所有子类都必须包含一个公共空构造函数。 框架通常会在需要时重新实例化一个片段类, 特别是在状态恢复期间,需要能够找到这个 构造函数来实例化它。如果没有空构造函数 可用时,在某些情况下会在状态期间发生运行时异常 还原
考虑通过setArguments
方法和捆绑设置参数 - 这样,当Android重新创建片段时,它就能将参数设置为旧值。
支持论文的东西:http://developer.android.com/reference/android/app/Fragment.html#setArguments(android.os.Bundle)
答案 1 :(得分:1)
在最后一次调用Log.d()时,gameFragment.testValue返回null - 这是怎么回事?
一种可能性是您的流程已经终止。 Android将使用零参数公共构造函数重新创建您的片段,它将为您提供savedInstanceState
Bundle
。但是“保留片段”的“保留”部分仅用于配置更改,因此仅通过该方式保留的任何内容都将丢失。