它应该不会触发Android Fragment onCreateView

时间:2015-09-03 18:50:17

标签: android android-fragments

我有一个活动和几个片段。我的活动有一个抽屉列表,我用它来切换片段,大致如下所示:

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。

2 个答案:

答案 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所以没有任何意义不必要的隐藏观点。