Android 碎片,每次保存实例还是重新创建?
Android Fragments, save instance or recreate each time?
我正在查看
中的示例
我成功地将它整合到我的应用程序中,但我不太了解 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();
}
从原始代码中,每次在抽屉中点击一个项目时,它都会创建一个新的片段。我知道如果这是第一次调用,您将需要它的一个实例。但是将片段保存在 activity 中的某处是否有意义?然后点击项目切换到它?
类似
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();
}
这主要取决于情况或必要性。从内存使用的角度来看,最好保存实例以备后用。
毕竟所有片段都是关于利用预准备提供更流畅的用户体验。
片段在 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
:
上恢复
重要的一点是,在 activity 中,您必须在 onSaveInstanceState
上保存片段实例并在 onCreate
上恢复。
了解更多信息Saving Fragment States
我正在查看
中的示例我成功地将它整合到我的应用程序中,但我不太了解 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();
}
从原始代码中,每次在抽屉中点击一个项目时,它都会创建一个新的片段。我知道如果这是第一次调用,您将需要它的一个实例。但是将片段保存在 activity 中的某处是否有意义?然后点击项目切换到它?
类似
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();
}
这主要取决于情况或必要性。从内存使用的角度来看,最好保存实例以备后用。
毕竟所有片段都是关于利用预准备提供更流畅的用户体验。
片段在 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
:
重要的一点是,在 activity 中,您必须在 onSaveInstanceState
上保存片段实例并在 onCreate
上恢复。
了解更多信息Saving Fragment States