我正在查看
中的示例我设法在我的应用程序中成功地将其合并,但我无法理解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();
}
答案 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