我对在片段之间切换的单个Activity的最佳方式感兴趣。
例如,如果我使用此处显示的导航抽屉:http://developer.android.com/training/implementing-navigation/nav-drawer.html,则每次点击抽屉列表中的项目都会被调用:
/** Swaps fragments in the main content view */
private void selectItem(int position) {
// Create a new fragment and specify the planet to show based on position
Fragment fragment = new PlanetFragment();
Bundle args = new Bundle();
args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position);
fragment.setArguments(args);
// Insert the fragment by replacing any existing fragment
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment)
.commit();
// Highlight the selected item, update the title, and close the drawer
mDrawerList.setItemChecked(position, true);
setTitle(mPlanetTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
}
因此,每次(即使用户转到先前显示的片段),都会创建一个新片段,然后它将替换当前片段。有没有更好的办法?例如,重用片段实例,或类似的东西?
答案 0 :(得分:1)
是,
您可以在PlanetFragment中创建一个设置位置的公共方法,并更新UI。
private void selectItem(int position) {
PlanetFragment planet = (PlanetFragment) getFragmentManager().findFragmentById(R.id.content_frame);
if(planet != null) {
planet.setPosition(position);
}
}
但是,您原来的解决方案应该没问题。片段事务很快,是时候实现更新UI的逻辑了。在大多数情况下,重建整个片段更容易,就像你这样做一样。
考虑这种方法,如果Fragment需要长时间的初始化,这会导致进度条和延迟(在UI中)。这样就可以避免重新启动,因此只能更新状态(本例中的位置)。
答案 1 :(得分:0)
如果您的列表中包含少量项目和常量项目,则可以引用所有项目,如果引用不是null
,则您不必重新创建新项目。
如果您的片段彼此完全不同,如果片段使用相同或相似的布局,您只能使用一个片段,只需根据所选索引刷新它的内容。