我有一个活动和几个片段。我的活动有一个抽屉列表,我用它来切换片段,大致如下所示:
public class MainActivity extends AppCompatActivity
{
private PreferencesFragment preferencesFragment;
private HomeFragment homeFragment;
private void selectMenuItem(position)
{
Fragment fragment = null;
switch (position) {
case 0:
if (preferencesFragment == null) {
preferencesFragment = new PreferencesFragment();
}
fragment = preferencesFragment;
break;
case 1:
if (homeFragment == null) {
homeFragment = new HomeFragment();
}
fragment = homeFragment;
break;
}
getFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, fragment)
.commit();
}
}
因此,每当我点击抽屉列表项时,都会使用正确的位置调用selectMenuItem。这会加载现有片段或在需要时创建新片段。问题是,即使片段已经存在,onCreateView方法也会在片段中触发。我想维护视图的状态,只在onCreateView中执行一次代码。文档说明了onCreateView:
当片段第一次绘制其用户界面时,系统会调用此方法。要为片段绘制UI,必须从此方法返回视图,该视图是片段布局的根。如果片段没有提供UI,则可以返回null。
那么为什么每次执行selectMenuItem都会调用它?我确认它实际上没有执行新的Fragment()块并加载属性值。当我只使用1个活动时,如何保持碎片的状态?
片段中的onCreateViewMethod中的savedInstanceState也为null。永远不会在片段中触发onSavedInstanceState。
答案 0 :(得分:0)
是的,这就是片段生命周期的工作原理。 replace()
删除任何现有片段,删除片段会破坏其视图。在稍后的片段事务中重用相同的Fragment
实例将从头开始再次触发生命周期。
正如Ivan在他的评论中提到的,onSaveInstanceState()
仅在触发托管活动的onSaveInstanceState()
时被触发,并且仅仅替换活动中的片段使活动保持不变。您可以自己保存状态,例如, android fragment- How to save states of views in a fragment when another fragment is pushed on top of it
要允许您的片段收集垃圾,请考虑不要保留对它们的引用。
答案 1 :(得分:0)
如果用另一个片段替换片段 - 视图会被破坏,这是正确的行为。如果你真的需要避免查看娱乐,你可以使用FragmentTransaction.hide(),但是你现在的方法是正确的,你不知道用户是否想要看PreferencesFragment
所以没有任何意义不必要的隐藏观点。