Android Fragments,保存实例或每次重新创建?

时间:2015-02-01 09:16:26

标签: android android-activity android-fragments

我正在查看

中的示例

https://github.com/lemycanh/DrawerOnTopActionBar/blob/master/src/com/example/drawerontopactionbar/MainActivity.java

我设法在我的应用程序中成功地将其合并,但我无法理解onItemClick函数。

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    mDrawerLayout.closeDrawer(mDrawerList);
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction ftx = fragmentManager.beginTransaction();
    if(position == 0) {
        ftx.replace(R.id.main_content, new FragmentFirst());
    } else if(position == 1) {
        ftx.replace(R.id.main_content, new FragmentSecond());
    }
    ftx.commit();
}

从原始代码开始,每次在抽屉中点击一个项目时,它都会创建一个新的片段。我明白,如果这是第一次你需要它的实例。但是将片段保存在活动的某个地方是不是有意义?单击项目后切换到它?

这样的东西
Fragment fOne;
Fragment fTwo;

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    mDrawerLayout.closeDrawer(mDrawerList);
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction ftx = fragmentManager.beginTransaction();
    if(position == 0) {
        if( fOne==null){
            fOne = new FragmentFirst();
        }
        ftx.replace(R.id.main_content, fOne);
    } else if(position == 1) {
    if( fTwo==null){
            fTwo = new FragmentSecond();
        }
        ftx.replace(R.id.main_content, fTwo);
    }
    ftx.commit();
}

2 个答案:

答案 0 :(得分:0)

主要取决于情况或必要性。从内存使用的角度来看,保存实例以供以后使用是件好事。

所有片段都是关于利用预备就绪提供更顺畅的ux。

答案 1 :(得分:0)

片段是硬编码的,xml无法替换....但是当你调用replace(..)时会发生什么?好吧,只要考虑你有2个片段 A,B 。在初级阶段 A 在MainActivity中初始化...现在,您将使用replace(....)调用 B 。这意味着 A 将进入onPause(),onStop()生命周期状态, B 将在MainActivity中初始化并加速...如果您想重复使用 A 然后您需要使用replace (..)再次致电 A 。然后 A 将重新初始化, B 将转到onPause()onStop()。但是还有另一种方法可以做到这一点

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
hide(A);
show(B);
ft.commit();

如果你使用上面的代码块,那么A仍然处于其生命周期的运行状态但是不可见(只是从UI分离)..所以如果你再次需要那些片段使用hide()或show()会更好方法因为便宜操作然后重新初始化片段。

it's better to use the attach() and detach() transactions instead of show() and hide() if you wish to retain the fragment instance but remove it from the UI

仍然有一种方法可以保存片段实例。 在片段中,通过覆盖onSaveInstanceState保存实例状态并在onActivityCreated上恢复:

重要的是,在活动中,您必须在onSaveInstanceState上保存片段的实例并在onCreate上恢复。

了解更多信息Saving Fragment States